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

相关推荐
mldong7 小时前
你的 Vue3 项目也能有钉钉同款审批流设计器:npm 装包,10 分钟画出第一条审批流
前端·vue.js
2分钟速写快排8 小时前
什么是 RAG?如何用 RAG 实现一个用户记忆?
前端·后端·ai编程
passerby60618 小时前
如何自己造一个时间处理库
前端·javascript·github
走到天涯海角10 小时前
react里面的长列表渲染优化
前端·react.js·前端框架
小羊没烦恼!10 小时前
Hello Web API系列教程——Web API与国际化
java·服务器·前端·javascript·php
北岛贰10 小时前
迷茫焦虑期,我做了一个带支付带官网的 AI 聊天虚拟恋人 App
前端·人工智能·后端
mayaairi11 小时前
Vue2 组件通讯(三):全局事件总线、PubSub、插槽与组件实例属性
前端·javascript·vue.js
kyriewen12 小时前
面试官问我:AI 都能写代码了,前端凭什么还值 25K
前端·javascript·人工智能
风骏时光牛马13 小时前
AI源码分析:拆解模型底层实现逻辑
前端
IT_陈寒13 小时前
React子组件莫名其妙重渲染?你可能漏了这个Hook
前端·人工智能·后端