zoukankan      html  css  js  c++  java
  • electron右键菜单、托盘、通知、应用菜单、文件菜单浏览、确认对话框

    -

    这次把electron更新到了当前最新版本:16.0.6

    需要用yarn命令安装,否则node install.js容易安装失败;

    这次主要熟悉:预加载文件(preload)、菜单设置(Menu MenuItem)、导航设置、系统通知框(Notification)、消息框、确认框((dialog)、托盘(tray)、

    目录结构:

     pakage.json:

    {
      "name": "electronTest",
      "version": "1.0.0",
      "description": "",
      "main": "main.js",
      "scripts": {
        "test": "echo \"Error: no test specified\" && exit 1",
        "serve": "electron ."
      },
      "keywords": [],
      "author": "",
      "license": "ISC",
      "dependencies": {
        "electron": "^16.0.6"
      }
    }

    index.html:

    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <meta http-equiv="X-UA-Compatible" content="IE=edge">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <!-- 安全设置 -->
      <meta http-equiv="Content-Security-Policy" content="default-src 'self' 'unsafe-inline';">
      <title>Document</title>
    </head>
    <body>
      <h1>Hello World!</h1>
      <span>chrome-version:</span>
      <h1 id="chrome-version"></h1>
      <span>node-version:</span>
      <h1 id="node-version"></h1>
      <span>electron-version:</span>
      <h1 id="electron-version"></h1>
      <script>
        console.log('html 页面js执行');
      </script>
    </body>
    </html>

    main.js

    const { app, BrowserWindow, Notification, Menu, MenuItem, Tray, nativeImage, dialog, screen } = require('electron')
    const path = require('path')
    const menuTemplate = require('./data/menuTemplate')
    // 保持一个对于 window 对象的全局引用,不然,当 JavaScript 被 GC,
    // window 会被自动地关闭
    var mainWindow = null;
    
    // 当所有窗口被关闭了,退出。
    app.on('window-all-closed', function() {
      // 在 OS X 上,通常用户在明确地按下 Cmd + Q 之前
      // 应用会保持活动状态
      if (process.platform != 'darwin') {
        app.quit();
      }
    });
    // 调用系统通知
    const NOTIFICATION_TITLE = '通知标题'
    const NOTIFICATION_BODY = '通知内容'
    function showNotification () {
      new Notification({ title: NOTIFICATION_TITLE, body: NOTIFICATION_BODY }).show()
    }
    // 当 Electron 完成了初始化并且准备创建浏览器窗口的时候
    // 这个方法就被调用
    app.on('ready', function() {
      // 获取屏幕宽高  可以在创建窗口时传入,这样就可以让初始屏幕全屏
      const { width, height } = screen.getPrimaryDisplay().workAreaSize;
      console.log(process.platform, 'process.platform');
      // Menu.setApplicationMenu(null) //取消菜单栏
      // 创建浏览器窗口。
      mainWindow = new BrowserWindow({
         800,
        height: 800,
        // frame: false, // windows下隐藏导航栏
        // titleBarStyle: 'hidden', // mac下隐藏导航栏
        webPreferences: {
          nodeIntegration: true, // 是否启用Node integration. 5.0以后默认值为 false.
          contextIsolation: false, // 设置为false后,才能在渲染进程使用Electron API
          preload: path.join(__dirname, 'preload.js')
        }
      });
    
      // 加载应用的 index.html
      // mainWindow.loadURL('file://' + __dirname + '/index.html');
      mainWindow.loadFile('index.html');
      // 定义菜单
      const menu = new Menu();
      menu.append(new MenuItem({label: '复制', role: 'copy'}));
      menu.append(new MenuItem({label: '粘贴', role: 'paste'}));
      menu.append(new MenuItem({label: '刷新', role: 'reload'}));
      menu.append(new MenuItem({label: '全选', role: 'selectall'}));
      menu.append(new MenuItem({label: '剪切', role: 'cut'}));
      menu.append(new MenuItem({label: '删除', role: 'delete'}));
      menu.append(new MenuItem({label: '取消', role: 'undo'}));
      menu.append(new MenuItem({label: '重置', role: 'redo'}));
      mainWindow.webContents.on('context-menu', (e, params) => {
        menu.popup({window: mainWindow, x: params.x, y: params.y});
      })
      // 设置系统托盘(系统图标)底部菜单小三角里的图标,而不是底部菜单的图标
      const icon = nativeImage.createFromPath('./image/img1.png');
      const tray = new Tray(icon);
      // 给图片图标加上右键菜单
      const contextMenu = Menu.buildFromTemplate([
        { label: 'Item1', type: 'radio' },
        { label: 'Item2', type: 'radio' },
        { label: 'Item3', type: 'radio', checked: true },
        { label: 'Item4', type: 'radio' }
      ])
      tray.setContextMenu(contextMenu);
      // 给托盘加个工具提示或标题
      tray.setToolTip('This is my application')
      tray.setTitle('This is my title');
      // 确认框
      dialog.showOpenDialog(mainWindow, {
        properties: ['openFile'],
        filters:[
          {name: 'Images', extensions: ['jpg', 'png', 'gif']},
          {name: 'Movies', extensions: ['mkv', 'avi', 'mp4']},
          {name: 'Custom File Type', extensions: ['as']},
          {name: 'All Files', extensions: ['*']}
        ]
      }).then(result => {
        console.log(result.canceled)
        console.log(result.filePaths)
      }).catch(err => {
        console.log(err)
      })
      // 消息框
      dialog.showMessageBox(mainWindow, {
        type: 'warning',
        title: '消息框' + app.name,
        icon: './image/img1.png',
        defaultId: 0,
        cancelId: 1,
        message: '你确定要退出?',
        buttons: ['退出', '取消']
      }).then(r => {
        if(r.response === 0) {
          app.exit();
        } else {
          console.log(r.response);
        }
      })
      // 打开开发工具
      mainWindow.openDevTools();
    
      // 当 window 被关闭,这个事件会被发出
      mainWindow.on('closed', function() {
        // 取消引用 window 对象,如果你的应用支持多窗口的话,
        // 通常会把多个 window 对象存放在一个数组里面,
        // 但这次不是。
        mainWindow = null;
      });
      // 通知
      showNotification()
    });
    
    // 设置系统菜单
    const list = Menu.buildFromTemplate(menuTemplate)
    Menu.setApplicationMenu(list);

    preload.js

    console.log('预加载文件执行')
    window.addEventListener('DOMContentLoaded', () => {
      const replaceText = (selector, text) => {
        const element = document.getElementById(selector)
        if (element) element.innerText = text
      }
    
      for (const type of ['chrome', 'node', 'electron']) {
        replaceText(`${type}-version`, process.versions[type])
      }
    })

    data/menuTemplate.js

    const template = [
      {
        label: '首页'
      },
      {
        label: '新闻资讯',
        submenu: [
          {
            label: '国内新闻',
            submenu: [
              {
                  label: '北京新闻'
              }, {
                  label: '河南新闻'
              }
            ]
          },
          {
              label: '国际新闻'
          }
        ]
      },
      {
        label: '娱乐',
        submenu: [
          {
              label: '音乐'
          }, {
              label: '电影'
          }, {
              label: '综艺'
          }
        ]
      },
      {
        label: '科技',
        submenu: [
          {
              label: 'Al'
          },
          {
              label: '手机'
          },
          {
              label: '互联网'
          }
        ]
      }
    ]
    
    module.exports = template

    -

  • 相关阅读:
    encode 与 decode
    pthon_flask小汇总
    jquery 动态添加标签而且指定样式
    设置Myeclipse中的代码格式化、及保存时自动格式化
    a href="javascript:void(0)" 是什么意思?与 a href="#" 加不加上有什么区别?
    String类 与StringBuffer类
    Java中的String类与StringBuffer类
    获取系统的当前时间
    switch 中可以使用字符串当判断条件
    关于接口的那些事
  • 原文地址:https://www.cnblogs.com/fqh123/p/15779972.html
Copyright © 2011-2022 走看看