electron基础:开发Macos和Windows应用的菜单栏

1. Electron创建菜单栏

在 Electron 应用程序中创建桌面菜单栏可以提供用户界面上的导航和操作选项。你可以使用 Electron 的 MenuMenuItem 模块来创建和管理菜单栏。以下是创建桌面菜单栏的一般步骤:

  1. 导入 Electron 模块:

首先,确保在你的 Electron 主进程代码中导入 MenuMenuItem 模块:

javascript 复制代码
const { app, BrowserWindow, Menu, MenuItem } = require('electron');
  1. 创建菜单项:

使用 MenuItem 创建每个菜单项,例如:

arduino 复制代码
const fileMenuItem = new MenuItem({
  label: 'File',
  submenu: [
    {
      label: 'Open',
      click: () => {
        // 在这里处理点击 "Open" 菜单项的逻辑
      }
    },
    {
      label: 'Save',
      click: () => {
        // 在这里处理点击 "Save" 菜单项的逻辑
      }
    },
    { type: 'separator' }, // 分隔线
    {
      label: 'Exit',
      click: () => {
        app.quit(); // 退出应用程序
      }
    }
  ]
});
  1. 创建菜单:

使用 Menu 创建整个菜单栏,将菜单项添加到菜单中:

less 复制代码
const menu = new Menu();
menu.append(fileMenuItem); // 添加 "File" 菜单项
// 添加其他菜单项...

// 设置菜单栏
Menu.setApplicationMenu(menu);
  1. 在应用程序准备就绪时设置菜单栏:

通常,在应用程序准备就绪时(app.whenReady()),设置菜单栏以确保应用程序启动后显示菜单栏:

scss 复制代码
app.whenReady().then(() => {
  // 创建主窗口等初始化工作...

  // 设置菜单栏
  Menu.setApplicationMenu(menu);
});

这是一个简单的示例,演示了如何创建一个包含 "File" 菜单的菜单栏。你可以根据你的应用程序的需求创建更多的菜单项和子菜单。

完整的代码示例如下:

javascript 复制代码
const { app, BrowserWindow, Menu, MenuItem } = require('electron');

// 创建主窗口等初始化工作...

// 创建 "File" 菜单项
const fileMenuItem = new MenuItem({
  label: 'File',
  submenu: [
    {
      label: 'Open',
      click: () => {
        // 处理点击 "Open" 菜单项的逻辑
      }
    },
    {
      label: 'Save',
      click: () => {
        // 处理点击 "Save" 菜单项的逻辑
      }
    },
    { type: 'separator' }, // 分隔线
    {
      label: 'Exit',
      click: () => {
        app.quit(); // 退出应用程序
      }
    }
  ]
});

// 创建 "Edit" 菜单项
const editMenuItem = new MenuItem({
  label: 'Edit',
  submenu: [
    // 添加其他编辑菜单项...
  ]
});

// 创建菜单
const menu = new Menu();
menu.append(fileMenuItem); // 添加 "File" 菜单项
menu.append(editMenuItem); // 添加 "Edit" 菜单项
// 添加其他菜单项...

// 在应用程序准备就绪时设置菜单栏
app.whenReady().then(() => {
  // 创建主窗口等初始化工作...

  // 设置菜单栏
  Menu.setApplicationMenu(menu);
});

通过类似的方式,你可以创建自定义的菜单栏,以满足你的应用程序的需求。

2. Electron创建菜单栏实战

在上面的内容中简单介绍了Electron中创建菜单栏的方法,但是在实际项目中考虑到语言的切换,不能够将菜单栏名称写死在代码中。

  1. 创建文本常量cn_constants.js

    sql 复制代码
    const CNTextContainer = {
        topic : "主题",
        edit : "编辑",
        view : "查看",
        window: "窗口",
        help: "帮助",
        about: "关于",
        options: "选项",
        quit: "退出",
        cancel: "取消",
        redo: "重做",
        cut:"剪切",
        copy:"复制",
        paste:"粘贴",
        paste_pure_text:"纯文本粘贴",
        delete:"删除",
        choose_all:"全选",
        search:"搜索",
        refresh:"刷新",
        dark:"深色模式",
        full_screen:"全屏",
        home_page:"主页",
        new:"新建"
    };
    module.exports = CNTextContainer;

如果未来需要切换中英文模式,只需要修改导入的js文件的路径即可。

  1. 创建menu.js文件

    yaml 复制代码
    // 1.导入 electron 中的 Menu
    const { Menu, BrowserWindow } = require('electron')
    const TextContainer = require('./constants/en_constants')
    const ShortCuts = require('./constants/shortcuts')
    // 2.创建菜单模板,数组里的每一个对象都是一个菜单
    const template = [
      {
        label: TextContainer.topic,
        // submenu 代表下一级菜单
        submenu: [
          { 
              label:  TextContainer.options,
              // 添加快捷键
              accelerator: ShortCuts.options
          },
          { 
            label:  TextContainer.new,
            accelerator: ShortCuts.new,
            click: ()=>{
                let sonWindow = new BrowserWindow(
                    {
                        width: 500,
                        height:500
                    }
                )
                sonWindow.loadFile("./index.html")
                sonWindow.on('close',()=>{
                    sonWindow = null
                })
            }
          },
          { 
            label:  TextContainer.quit,
            accelerator: ShortCuts.quit,
            click: ()=>{
                const mainWindow = BrowserWindow.getFocusedWindow();
                if (mainWindow) {
                    mainWindow.close();
                }
            }
          },
        ],
      },
      {
        label: TextContainer.edit,
        submenu: [
          { 
              label:  TextContainer.cancel,
              accelerator: ShortCuts.cancel
          },
          { 
            label:  TextContainer.redo,
            accelerator: ShortCuts.redo
          },
          { 
            label:  TextContainer.cut,
            accelerator: ShortCuts.cut
          },
          { 
            label:  TextContainer.copy,
            accelerator: ShortCuts.copy
          },
          { 
            label:  TextContainer.paste,
            accelerator: ShortCuts.paste
            },
            { 
            label:  TextContainer.paste_pure_text,
            accelerator: ShortCuts.paste_pure_text
            },
            { 
            label:  TextContainer.delete,
            accelerator: ShortCuts.delete
            },
            { 
            label:  TextContainer.choose_all,
            accelerator: ShortCuts.choose_all
            },
            { 
                label:  TextContainer.search,
                accelerator: ShortCuts.search
            }
        ],
      },  {
        label: TextContainer.view,
        // submenu 代表下一级菜单
        submenu: [
          { 
              label:  TextContainer.refresh,
              // 添加快捷键
              accelerator: ShortCuts.refresh
          },
          { 
            label:  TextContainer.dark,
            accelerator: ShortCuts.dark
          },
          { 
            label:  TextContainer.full_screen,
            accelerator: ShortCuts.full_screen
          },
        ],
      },  {
        label: TextContainer.help,
        // submenu 代表下一级菜单
        submenu: [
          { 
              label:  TextContainer.home_page,
              // 添加快捷键
              accelerator: ShortCuts.home_page
          }
        ],
      },
    ]
    
    // 3.从模板中创建菜单
    const myMenu = Menu.buildFromTemplate(template)
    
    // 4.设置为应用程序菜单
    Menu.setApplicationMenu(myMenu)

在这个文件中导入需要的语言包,配置菜单栏的label,并且为一些菜单栏添加点击事件。

  1. 在main.js中导入菜单栏

    scss 复制代码
    // main.js
    const { app, BrowserWindow } = require('electron');
    //导入菜单栏
    require('./src/menu')
    function createWindow() {
      const win = new BrowserWindow({
        width: 800,
        height: 600,
        webPreferences: {
          nodeIntegration: true
        }
      });
    
      win.loadFile('index.html');
    }
    
    app.whenReady().then(createWindow);
    
    app.on('window-all-closed', () => {
      if (process.platform !== 'darwin') {
        app.quit();
      }
    });
    
    app.on('activate', () => {
      if (BrowserWindow.getAllWindows().length === 0) {
        createWindow();
      }
    });
  2. 运行效果

相关推荐
gongzemin3 分钟前
React 和 Vue3 在事件传递的区别
前端·vue.js·react.js
Apifox16 分钟前
如何在 Apifox 中通过 Runner 运行包含云端数据库连接配置的测试场景
前端·后端·ci/cd
树上有只程序猿43 分钟前
后端思维之高并发处理方案
前端
庸俗今天不摸鱼1 小时前
【万字总结】前端全方位性能优化指南(十)——自适应优化系统、遗传算法调参、Service Worker智能降级方案
前端·性能优化·webassembly
黄毛火烧雪下1 小时前
React Context API 用于在组件树中共享全局状态
前端·javascript·react.js
Apifox2 小时前
如何在 Apifox 中通过 CLI 运行包含云端数据库连接配置的测试场景
前端·后端·程序员
一张假钞2 小时前
Firefox默认在新标签页打开收藏栏链接
前端·firefox
高达可以过山车不行2 小时前
Firefox账号同步书签不一致(火狐浏览器书签同步不一致)
前端·firefox
m0_593758102 小时前
firefox 136.0.4版本离线安装MarkDown插件
前端·firefox
掘金一周2 小时前
金石焕新程 >> 瓜分万元现金大奖征文活动即将回归 | 掘金一周 4.3
前端·人工智能·后端