Eletron自定义菜单

587 阅读1分钟

仅供学习参考

Menu() 自定义菜单

template是一个options类型的数组,用于构建MenuItem。

1.创建菜单模板

const template = [
  {
    label: 'Electron'
  },
  {
    label: 'Edit'
  },
  {
    label: 'View'
  },
  {
    label: 'Help'
  },
]

2.使用buildFromTemplate编译模板,创建模板对象

3.把模板对象设置成菜单

menu.ts

import {
  app,
  Menu,
  shell,
  BrowserWindow,
  MenuItemConstructorOptions,
} from 'electron';

import { settingMenu } from './setting';

interface DarwinMenuItemConstructorOptions extends MenuItemConstructorOptions {
  selector?: string;
  submenu?: DarwinMenuItemConstructorOptions[] | Menu;
}

export default class MenuBuilder {
  mainWindow: BrowserWindow;

  constructor(mainWindow: BrowserWindow) {
    this.mainWindow = mainWindow;
  }

  buildMenu(): Menu {

    //创建菜单模板
    const template =this.buildDarwinTemplate();
    //使用buildFromTemplate编译模板,创建模板对象
    const menu = Menu.buildFromTemplate(template);
    //把模板对象设置成菜单(在 Windows 和 Linux 上,将设置为每个窗口的顶部菜单)
    Menu.setApplicationMenu(menu);

    return menu;
  }

  //定义菜单模板
  buildDarwinTemplate(): MenuItemConstructorOptions[] {
    const subMenuAbout: DarwinMenuItemConstructorOptions = {
      //菜单标题
      label: 'Electron',
      //子菜单
      submenu: [
        //下一层子菜单
        { label: 'Services', submenu: [] },
        //分割线
        { type: 'separator' },
        { label: 'Show All', selector: 'unhideAllApplications:' },
        {
          label: 'Quit',
          //快捷键
          accelerator: 'Command+Q',
          //点击事件
          click: () => {
            app.quit();
          },
        },
      ],
    };
    const subMenuEdit: DarwinMenuItemConstructorOptions = {
      label: 'Edit',
      submenu: [
        { label: 'Cut', accelerator: 'Command+X', selector: 'cut:' },
        { label: 'Copy', accelerator: 'Command+C', selector: 'copy:' },
        { label: 'Paste', accelerator: 'Command+V', selector: 'paste:' },
        {
          label: 'new BrowserWindow',
          click: () => {
            new BrowserWindow({
              width: 500,
              height:500
            })
          },
        },
      ],
    };
    const subMenuViewDev: MenuItemConstructorOptions = {
      label: 'View',
      submenu: [
        {
          label: 'Reload',
          accelerator: 'Command+R',
          //刷新页面
          click: () => {
            this.mainWindow.webContents.reload();
          },
        },
        {
          label: 'Toggle Full Screen',
          accelerator: 'Ctrl+Command+F',
          //全屏
          click: () => {
            this.mainWindow.setFullScreen(!this.mainWindow.isFullScreen());
          },
        },
        {
          label: 'Toggle Developer Tools',
          accelerator: 'Alt+Command+I',
          //打开开发工具
          click: () => {
            this.mainWindow.webContents.toggleDevTools();
          },
        },
      ],
    };
    const subMenuHelp: MenuItemConstructorOptions = {
      label: 'Help',
      submenu: [
        settingMenu,
        {
          label: 'Learn More',
          click() {
            shell.openExternal('https://electronjs.org');
          },
        },
      ],
    };

    return [subMenuAbout, subMenuEdit, subMenuViewDev, subMenuHelp];
  }
}

main.ts

import MenuBuilder from './menu';
const createWindow = async () => {
...
  mainWindow = new BrowserWindow({...})

  const menuBuilder = new MenuBuilder(mainWindow);
  menuBuilder.buildMenu();
...
}

setting.ts

...
export const settingMenu = {
  label: '&设置',
  accelerator: 'Ctrl+S',
  click: () => {
    createSettingWindow();
  },
};
...

image.png

image.png

image.png

image.png