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. 运行效果

相关推荐
竹林8189 分钟前
从 RPC 超时到批量签名:我用 @solana/web3.js 重构了一个 NFT 铸造页面,踩了这些坑
前端·javascript
工业HMI实战笔记19 分钟前
工业HMI界面布局“1核2辅”黄金结构,适配90%场景
前端·ui·性能优化·自动化·交互
林希_Rachel_傻希希1 小时前
web性能优化之————图片效果
前端·javascript·面试
Darling噜啦啦1 小时前
前端存储与 this 指向完全指南:从 LocalStorage 实战到 call/apply/bind 深度解析
前端·javascript
wei1986211 小时前
.net添加web引用和添加服务引用有什么区别?
java·前端·.net
格子软件2 小时前
2026年GEO优化系统源码级状态机与多模型调度拆解
java·前端·vue.js·人工智能·vue·geo
HUMHSX3 小时前
Vue 项目启动全流程解析:从入口文件到全局指令注册与页面渲染
前端·javascript·vue.js
有颜有货3 小时前
PMC生产排产的4种算法,一次讲清
java·服务器·前端
小虎牙0073 小时前
Android kotlin图片库Coil源码详解
android·前端
随风一样自由3 小时前
【前端领域】前端开发核心应用场景与落地实践
前端·前端框架