在之前的文章我们简单介绍了一下Electron可以用WEB语言开发桌面级应用,接下来我们继续说一下Electron的菜单创建和事件绑定。

我们接上一章的代码继续编写,上一章代码 https://www.cnblogs.com/weijiutao/p/13195306.html

上一章我们简单写了一个demo并跑了起来,我们会发现它和我们电脑上的其他程序软件一样有自带的菜单,如下图:

本人使用的是Mac,菜单在吸顶栏上,Windows电脑的话会跟随程序,一般的电脑程序都会有这样的菜单存在,方便我们进行一些快捷操作,接下来我们就对这个菜单栏进行一下创建定制。

官方关于Menu的解释地址:https://www.electronjs.org/docs/api/menu

从官方解释可以看出Menu为主进程的模块,仅在主进程( main process)中可用, 但您也可以在渲染进程(render process)中通过  remote  模块使用它。下一章我们可以说一下这个 remote 模块。

接上一章的目录下创建一个 menu.js 的文件,目录如下:

其中 menu.js 代码:

 const {Menu} = require('electron');
let template = [
{
label: '设置',
submenu: [
{label: '快捷键设置'},
{label: '系统设置'}
]
},
{
label: '关于',
submenu: [
{label: '关于Electron'},
{label: '关于Node'}
]
},
]; const menu = Menu.buildFromTemplate(template);
Menu.setApplicationMenu(menu);

在上面的代码中,我们定一了一个数组,其中label为菜单的名称,submenu为菜单底下的内容,即二级菜单,当然也可以继续嵌套submenu,就像我们平常写的树状结构一样。

然后我们将menu.js 引入到我们到主进程中,即index.js中:

 const {app, BrowserWindow} = require('electron')

 function createWindow() {
// 创建浏览器窗口
const win = new BrowserWindow({
width: 800,
height: 600,
webPreferences: {
nodeIntegration: true
}
}) /**
* 引入 menu.js
*/
require('./menu'); // 并且为你的应用加载index.html
win.loadFile('index.html') // 打开开发者工具
win.webContents.openDevTools()
} // Electron会在初始化完成并且准备好创建浏览器窗口时调用这个方法
// 部分 API 在 ready 事件触发后才能使用。
app.whenReady().then(createWindow) //当所有窗口都被关闭后退出
app.on('window-all-closed', () => {
// 在 macOS 上,除非用户用 Cmd + Q 确定地退出,
// 否则绝大部分应用及其菜单栏会保持激活。
if (process.platform !== 'darwin') {
app.quit()
}
}) app.on('activate', () => {
// 在macOS上,当单击dock图标并且没有其他窗口打开时,
// 通常在应用程序中重新创建一个窗口。
if (BrowserWindow.getAllWindows().length === 0) {
createWindow()
}
}) // 您可以把应用程序其他的流程写在在此文件中
// 代码 也可以拆分成几个文件,然后用 require 导入。

至此我们就完成了菜单的修改配置,如下:

需要注意的是我们的Mac电脑菜单的第一个label为系统自定义的名称,所以我们的“设置”二字并没有将其替换掉。

在上面的代码中我们已经重新定义了我们的菜单栏,接下来我们对菜单栏的菜单进行事件绑定,使其能够作为一个真正的功能使用。

官方为我们的每个菜单提供了一个click方法来帮助我们自定义菜单的绑定事件,如下:

 const {Menu, dialog} = require('electron');
const pjson = require('./package.json');
let template = [
{
label: '设置',
submenu: [
{label: '快捷键设置'},
{label: '系统设置'}
]
},
{
label: '关于',
submenu: [
{
label: '关于Electron',
// 绑定click方法
click: () => {
dialog.showMessageBox({
message: '当前版本:' + pjson.version,
}).then(result => {
console.log(result)
})
}
},
{label: '关于Node'},
]
},
]; const menu = Menu.buildFromTemplate(template);
Menu.setApplicationMenu(menu);

在上面的代码中,我们在其中一个submenu子项中添加了一个click事件,并注册了一个Electron为我们提供的dialog方法来获取到package.json中的version信息,通过对话框的形式为我们展示出来,最后的结果如下:

至此我们就实现来Electron的菜单创建和事件绑定,其中我们提到了remote模块和dialog模块,我会在接下来的内容中继续为大家说一下,先忙工作去了。。。

从零开始学Electron笔记(二)的更多相关文章

  1. 从零开始学Electron笔记(四)

    在之前的文章我们介绍了一下Electron的这个remote模块,接下来我们继续说一下Electron的右键菜单的制作. 在我们日常我们使用的软件中都会存在右键菜单的情况,比如我们用到的浏览器,开发所 ...

  2. 从零开始学Electron笔记(一)

    前端技术在最近几年迅猛发展,在任何开发领域我们都能看到前端的身影,从PC端到手机端,从APP到小程序,似乎前端已经无所不能,这就要求我们需要不断地去学习来提升自己!前段时间尤大通过直播介绍了一下Vue ...

  3. 从零开始学Electron笔记(六)

    在之前的文章我们介绍了一下Electron如何通过链接打开浏览器和嵌入网页,接下来我们继续说一下Electron中的对话框 Dialog和消息通知 Notification. 在之前的文章中其实我们是 ...

  4. 从零开始学Electron笔记(三)

    在之前的文章我们介绍了一下Electron的菜单创建和事件绑定,其中提到了一个remote模块,接下来我们继续说一下Electron的这个remote模块. 官方关于remote模块的地址:https ...

  5. 从零开始学Electron笔记(五)

    在之前的文章我们介绍了一下Electron的右键菜单的制作,接下来我们继续说一下Electron如何通过链接打开浏览器和嵌入网页. 现在有这样一个需求,我们要在我们的软件中加一个链接,然后点击该链接打 ...

  6. 从零开始学Electron笔记(七)

    在之前的文章我们介绍了一下Electron中的对话框 Dialog和消息通知 Notification,接下来我们继续说一下Electron中的系统快捷键及应用打包. 全局快捷键模块就是 global ...

  7. 从零开始学Xamarin.Forms(二) 环境搭建、创建项目

    原文:从零开始学Xamarin.Forms(二) 环境搭建.创建项目 一.环境搭建 Windows下环境搭建:     1.下载并安装jdk.Android SDK和NDK,当然还需要 VS2013 ...

  8. Java从零开始学四十二(DOM解析XML)

    一.DOM解析XML xml文件 favorite.xml <?xml version="1.0" encoding="UTF-8" standalone ...

  9. Java从零开始学三十二(正则表达式)

    一.为什么要有正则 正则表达式可以方便的对数据进行匹配,可以执行更加复杂的字符串验证.拆份.替换功能. 例如:现在要求判断一个字符串是否由数字组成,则可以有以下的两种做法: 不使用正则完成 使用正则完 ...

随机推荐

  1. 3.keras-简单实现Mnist数据集分类

    keras-简单实现Mnist数据集分类 1.载入数据以及预处理 import numpy as np from keras.datasets import mnist from keras.util ...

  2. Linux系统调用和ANSI C文件操作的区别

    一.在Linux下对文件操作有两种方式:Linux系统调用和ANSI C文件操作. 1.Linux系统调用调用常用于I/O文件操作,系统调用常用的函数有open.close.read.write.ls ...

  3. Volley框架学习资料汇总

    Android Volley完全解析(一),初识Volley的基本用法(http://blog.csdn.net/guolin_blog/article/details/17482095/)

  4. NASH:基于丰富网络态射和爬山算法的神经网络架构搜索 | ICLR 2018

    论文提出NASH方法来进行神经网络结构搜索,核心思想与之前的EAS方法类似,使用网络态射来生成一系列效果一致且继承权重的复杂子网,本文的网络态射更丰富,而且仅需要简单的爬山算法辅助就可以完成搜索,耗时 ...

  5. Iterable对象

    ''' 我们已经知道,可以直接作用于for循环的数据类型有以下几种: 一类是集合数据类型,如list.tuple.dict.set.str等: 一类是generator,包括生成器和带yield的ge ...

  6. MySQL 性能优化之慢查询

    性能优化的思路 首先需要使用慢查询功能,去获取所有查询时间比较长的SQL语句 其次使用explain命令去查询由问题的SQL的执行计划(脑补链接:点我直达1,点我直达2) 最后可以使用show pro ...

  7. 一文梳理JavaScript 事件循环(Event Loop)

    事件循环(Event Loop),是每个JS开发者都会接触到的概念,但是刚接触时可能会存在各种疑惑. 众所周知,JS是单线程的,即同一时间只能运行一个任务.一般情况下这不会引发问题,但是如果我们有一个 ...

  8. c++_primer_第4版目录

    https://vdisk.weibo.com/s/BN_NALmbbBH01 第1章 快速入门1.1 编写简单的C++程序1.2 初窥输入/输出1.2.1 标准输入与输出对象1.2.2 一个使用IO ...

  9. 解决错误 CS1617 Invalid option '7.1' for /langversion; must be ISO-1, ISO-2, Default or an integer in range 1 to 6.

    解决错误 CS1617 Invalid option '7.1' for /langversion; must be ISO-1, ISO-2, Default or an integer in ra ...

  10. C#数据结构与算法系列(十):逆波兰计算器——逆波兰表达式(后缀表达式)

    1.介绍 后缀表达式又称逆波兰表达式,与前缀表达式相似,只是运算符位于操作数之后 2.举例说明 (3+4)*5-6对应的后缀表达式就是3 4 +5 * 6 - 3.示例 输入一个逆波兰表达式(后缀表达 ...