资讯专栏INFORMATION COLUMN

使用 Electron 自定义菜单

MageekChiu / 1885人阅读

摘要:使用自定义菜单此系列文章的应用示例已发布于可以或下载后运行查看欢迎使用和模块可用于创建自定义本地菜单有两种菜单应用程序顶部菜单和上下文右键单击菜单在浏览器中打开完整的文档创建应用程序菜单支持进程使用和模块可以自定义你的应用程序菜单如果

使用 Electron 自定义菜单

此系列文章的应用示例已发布于 GitHub: electron-api-demos-Zh_CN. 可以 Clone 或下载后运行查看. 欢迎 Star .

使用 MenuMenuItem 模块可用于创建自定义本地菜单.

有两种菜单: 应用程序(顶部)菜单和上下文(右键单击)菜单.

在浏览器中打开 完整的 API 文档 .

创建应用程序菜单

支持: Win, macOS, Linux | 进程: Main

使用 MenuMenuItem 模块可以自定义你的应用程序菜单. 如果没有设置任何菜单, Electron 将为您的应用默认生成一个最小的菜单.

此应用程序使用下面的代码设置应用程序菜单. 如果您点击应用程序菜单中的 "查看" 选项, 然后点击 "应用程序菜单演示", 则会显示一个信息框.

主进程

const electron = require("electron")
const BrowserWindow = electron.BrowserWindow
const Menu = electron.Menu
const app = electron.app

let template = [{
  label: "编辑",
  submenu: [{
    label: "撤销",
    accelerator: "CmdOrCtrl+Z",
    role: "undo"
  }, {
    label: "重做",
    accelerator: "Shift+CmdOrCtrl+Z",
    role: "redo"
  }, {
    type: "separator"
  }, {
    label: "剪切",
    accelerator: "CmdOrCtrl+X",
    role: "cut"
  }, {
    label: "复制",
    accelerator: "CmdOrCtrl+C",
    role: "copy"
  }, {
    label: "粘贴",
    accelerator: "CmdOrCtrl+V",
    role: "paste"
  }, {
    label: "全选",
    accelerator: "CmdOrCtrl+A",
    role: "selectall"
  }]
}, {
  label: "查看",
  submenu: [{
    label: "重载",
    accelerator: "CmdOrCtrl+R",
    click: function (item, focusedWindow) {
      if (focusedWindow) {
        // 重载之后, 刷新并关闭所有的次要窗体
        if (focusedWindow.id === 1) {
          BrowserWindow.getAllWindows().forEach(function (win) {
            if (win.id > 1) {
              win.close()
            }
          })
        }
        focusedWindow.reload()
      }
    }
  }, {
    label: "切换全屏",
    accelerator: (function () {
      if (process.platform === "darwin") {
        return "Ctrl+Command+F"
      } else {
        return "F11"
      }
    })(),
    click: function (item, focusedWindow) {
      if (focusedWindow) {
        focusedWindow.setFullScreen(!focusedWindow.isFullScreen())
      }
    }
  }, {
    label: "切换开发者工具",
    accelerator: (function () {
      if (process.platform === "darwin") {
        return "Alt+Command+I"
      } else {
        return "Ctrl+Shift+I"
      }
    })(),
    click: function (item, focusedWindow) {
      if (focusedWindow) {
        focusedWindow.toggleDevTools()
      }
    }
  }, {
    type: "separator"
  }, {
    label: "应用程序菜单演示",
    click: function (item, focusedWindow) {
      if (focusedWindow) {
        const options = {
          type: "info",
          title: "应用程序菜单演示",
          buttons: ["好的"],
          message: "此演示用于 "菜单" 部分, 展示如何在应用程序菜单中创建可点击的菜单项."
        }
        electron.dialog.showMessageBox(focusedWindow, options, function () {})
      }
    }
  }]
}, {
  label: "窗口",
  role: "window",
  submenu: [{
    label: "最小化",
    accelerator: "CmdOrCtrl+M",
    role: "minimize"
  }, {
    label: "关闭",
    accelerator: "CmdOrCtrl+W",
    role: "close"
  }, {
    type: "separator"
  }, {
    label: "重新打开窗口",
    accelerator: "CmdOrCtrl+Shift+T",
    enabled: false,
    key: "reopenMenuItem",
    click: function () {
      app.emit("activate")
    }
  }]
}, {
  label: "帮助",
  role: "help",
  submenu: [{
    label: "学习更多",
    click: function () {
      electron.shell.openExternal("http://electron.atom.io")
    }
  }]
}]

function addUpdateMenuItems (items, position) {
  if (process.mas) return

  const version = electron.app.getVersion()
  let updateItems = [{
    label: `Version ${version}`,
    enabled: false
  }, {
    label: "正在检查更新",
    enabled: false,
    key: "checkingForUpdate"
  }, {
    label: "检查更新",
    visible: false,
    key: "checkForUpdate",
    click: function () {
      require("electron").autoUpdater.checkForUpdates()
    }
  }, {
    label: "重启并安装更新",
    enabled: true,
    visible: false,
    key: "restartToUpdate",
    click: function () {
      require("electron").autoUpdater.quitAndInstall()
    }
  }]

  items.splice.apply(items, [position, 0].concat(updateItems))
}

function findReopenMenuItem () {
  const menu = Menu.getApplicationMenu()
  if (!menu) return

  let reopenMenuItem
  menu.items.forEach(function (item) {
    if (item.submenu) {
      item.submenu.items.forEach(function (item) {
        if (item.key === "reopenMenuItem") {
          reopenMenuItem = item
        }
      })
    }
  })
  return reopenMenuItem
}

if (process.platform === "darwin") {
  const name = electron.app.getName()
  template.unshift({
    label: name,
    submenu: [{
      label: `关于 ${name}`,
      role: "about"
    }, {
      type: "separator"
    }, {
      label: "服务",
      role: "services",
      submenu: []
    }, {
      type: "separator"
    }, {
      label: `隐藏 ${name}`,
      accelerator: "Command+H",
      role: "hide"
    }, {
      label: "隐藏其它",
      accelerator: "Command+Alt+H",
      role: "hideothers"
    }, {
      label: "显示全部",
      role: "unhide"
    }, {
      type: "separator"
    }, {
      label: "退出",
      accelerator: "Command+Q",
      click: function () {
        app.quit()
      }
    }]
  })

  // 窗口菜单.
  template[3].submenu.push({
    type: "separator"
  }, {
    label: "前置所有",
    role: "front"
  })

  addUpdateMenuItems(template[0].submenu, 1)
}

if (process.platform === "win32") {
  const helpMenu = template[template.length - 1].submenu
  addUpdateMenuItems(helpMenu, 0)
}

app.on("ready", function () {
  const menu = Menu.buildFromTemplate(template)
  Menu.setApplicationMenu(menu)
})

app.on("browser-window-created", function () {
  let reopenMenuItem = findReopenMenuItem()
  if (reopenMenuItem) reopenMenuItem.enabled = false
})

app.on("window-all-closed", function () {
  let reopenMenuItem = findReopenMenuItem()
  if (reopenMenuItem) reopenMenuItem.enabled = true
})
高级技巧

了解操作系统菜单的差异.

在为多个操作系统设计应用程序时, 请务必注意应用程序菜单在每个操作系统上的不同约定之处。

例如, 在 Windows 上, 加速器设置为 . 命名约定也有所不同, 如 "设置" 或 "首选项". 下面是学习操作系统特定标准的资源:

macOS

Windows.aspx)

Linux

创建上下文菜单

支持: Win, macOS, Linux | 进程: Main

可以使用 MenuMenuItem 模块创建上下文或右键单击菜单. 您可以右键单击此应用程序中的任何位置, 或单击示例按钮以查看示例上下文菜单.

在这个示例中, 我们使用 ipcRenderer 模块来展示从渲染器进程显式调用它时的上下文菜单.

有关所有可用的属性请查看 上下文菜单事件文档 .

主进程

const electron = require("electron")
const BrowserWindow = electron.BrowserWindow
const Menu = electron.Menu
const MenuItem = electron.MenuItem
const ipc = electron.ipcMain
const app = electron.app

const menu = new Menu()
menu.append(new MenuItem({ label: "Hello" }))
menu.append(new MenuItem({ type: "separator" }))
menu.append(new MenuItem({ label: "Electron", type: "checkbox", checked: true }))

app.on("browser-window-created", function (event, win) {
  win.webContents.on("context-menu", function (e, params) {
    menu.popup(win, params.x, params.y)
  })
})

ipc.on("show-context-menu", function (event) {
  const win = BrowserWindow.fromWebContents(event.sender)
  menu.popup(win)
})

渲染器进程

const ipc = require("electron").ipcRenderer

// 告诉主进程在单击示例按钮时显示菜单
const contextMenuBtn = document.getElementById("context-menu")
contextMenuBtn.addEventListener("click", function () {
  ipc.send("show-context-menu")
})

如果这边文章对您有帮助, 感谢 下方点赞 或 Star GitHub: electron-api-demos-Zh_CN 支持, 谢谢.

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/81719.html

相关文章

  • Electron入门介绍

    摘要:本文主要讲解的入门。可以帮助我们管理包的下载依赖部署发布等。可以认为是中的。后续使用中,全部替换为即可。命令根据它,自动下载所需模块用于创建窗口和处理系统事件安装包的位置。 Electron是什么 可以认为Electron是一种运行环境库,我们可以基于此,用HTML、JS和CSS写桌面应用。PC端的UI交互,主要有web应用和桌面应用。具体采用哪种方式,主要看系统的应用场景,哪个更合适...

    wing324 评论0 收藏0
  • Electron折腾笔记

    摘要:读取文件路径写入配置文件调用服务调用服务部分,主要用到的子进程。最后,上一张初步完成之后的运行图博客原文 背景 部门的项目每次开发都需要手动开启三个服务:server、webpack、grunt,每个服务都要输入一些东西(端口号,项目命,项目类型,启动器名)。而且,在推送调试的时候,这三项服务非常容易被终止掉,然后又得一个个开起来,总之每天都要来上那么10几遍吧。看图:showImg(...

    DataPipeline 评论0 收藏0
  • 如何从0开发一个Atom组件

    摘要:将剪切板中的数据转换为然后暂存到本地,通过本地文件的方式来进行上传七牛。以上,就是开发一个插件的完整流程咯。 最近用Atom写博客比较多,然后发现一个很严重的问题。。没有一个我想要的上传图片的方式,比如某乎上边就可以直接copy/paste文件,然后进行上传。然而在Atom上没有找到类似的插件,最接近的一个,也还是需要手动选择文件,然后进行上传。这个操作流程太繁琐,索性自己写一个插件用...

    lauren_liuling 评论0 收藏0
  • Electron 实战桌面计算器应用

    摘要:在菜单中,我想点击子菜单打开一个网站,那么就可以用到方法,则会在默认浏览器中打开打包应用其实将程序打包成桌面应用才是比较麻烦的事。 前言 Electron 是一个搭建跨平台桌面应用的框架,仅仅使用 JavaScript、HTML 以及 CSS,即可快速而容易地搭建一个原生应用。这对于想要涉及其他领域的开发者来说是一个非常大的福利。 项目介绍 仓库地址:lin-xin/calculato...

    GeekQiaQia 评论0 收藏0

发表评论

0条评论

MageekChiu

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<