Electron实战之菜单与托盘

菜单、托盘是桌面端应用必备的功能之一,我们通常会在菜单上配置应用常用的:偏好设置、显示隐藏、打开文件等功能,在托盘内设置:退出、重启、帮助等辅助性功能,帮助用户方便快捷地控制应用的一些系统功能。系统托盘实际上也是一个菜单,通过点击鼠标触发。

一、应用菜单(Menu)

Electron 里的菜单大体上分为三类:应用菜单、上下文菜单和 Dock 菜单(仅针对 OSX 系统)。这里以 VSCode 为例,来分别介绍这几种菜单的含义。打开 VSCode 编辑器,可以通过下图,很清晰地发现 3 个菜单所处的位置。

图片

图片

1.1 应用内菜单

原生应用菜单可以理解为应用窗口菜单,在 MacOS 上,选中应用后,应用内菜单出现在桌面的左上方。在 Windows 和 Linux 上,Menu 将会被设置成窗口顶部菜单。在 Electron 中,通常会使用 Menu.setApplicationMenu(menu) 函数来设置应用内菜单。

import { Menu } from 'electron'function createMenu () {const template = [{label: '菜单一',submenu: [{label: '功能一'},{label: '功能二'}]},{label: '菜单二',submenu: [{label: '功能一'},{label: '功能二'}]}];const menu = Menu.buildFromTemplate(template);Menu.setApplicationMenu(menu);
}

通过以上代码设置完成一个应用菜单后,在 macOS 下的效果如下。

图片

可以看到第一个菜单的标题是 Electron 而不是我们设置的标题 菜单一。这是因为:在 macOS 中应用程序菜单的第一个项目的标签总是你的应用程序的名字,无论你设置什么标签。如果你想展示成自己的标题,Electron 官方给了一种修改 Info.plist 的方法:About Information Property List Files。除此之外,你也可以重新修改一下 template 的格式:

if (process.platform === 'darwin') {template.unshift({label: app.getName(),submenu: [{label: 'Quit',click() {app.quit();}}]});
}

这样,三个菜单就显示出来了,如下图所示。

图片

上述代码中,对于 template 菜单项字段内有很多配置项,具体的字段也可以直接阅读官方文档,针对每个字段都有详细的解释。

1.2 上下文菜单(context menu)

上下文菜单(context menu)就是我们通常说的右键菜单,需要注意的是:上下文菜单,需要在渲染进程中进行实现,可以通过 IPC 发送所需的信息到主进程,并让主进程代替渲染进程显示菜单,示例代码如下。

// 主进程 main/index.js
ipcMain.on('show-context-menu', (event) => {const template = [{label: '菜单一',click: () => {// 发送点击菜单一事件到渲染进程event.sender.send('context-menu-command', 'menu-item-1')}},{ type: 'separator' },{label: '菜单二',type: 'checkbox',checked: true}]const menu = Menu.buildFromTemplate(template)menu.popup({window: BrowserWindow.fromWebContents(event.sender)})
})
// 渲染进程 renderer/main.js
window.addEventListener("contextmenu", (e) => {e.preventDefault();electron.ipcRenderer.send("show-context-menu");
});
electron.ipcRenderer.on("context-menu-command", (e, command) => {// todo
});

最终的运行效果如下图。

图片

1.3 Dock 菜单(仅 MacOS 可用)

Dock 的菜单实现也是在主进程中,可以通过 app.dock.setMenu 这个 API 来直接创建。

// main.js
const createDockMenu = () => {const dockTempalte = [{label: '菜单一',click () {console.log('New Window');}}, {label: '菜单二',submenu: [{ label: 'Basic' },{ label: 'Pro' }]},{label: '其他...'}];const dockMenu = Menu.buildFromTemplate(dockTempalte);app.dock.setMenu(dockMenu);
}

运行效果如下图。

图片

二、应用托盘(Tray)

实现应用托盘主要依托于 Electron 的 Tray 模块,在 MacOS 和 Ubuntu,托盘将位于屏幕右上角上,靠近你的电池和 wifi 图标。在 Windows 上,托盘通常位于右下角。

图片

通过以上图片可以清晰地看到创建一个托盘需要准备一个图标用于显示,以及一个菜单项用于呈现所需的功能菜单。我们来看一下 Windows 下一个简单的应用托盘的实现方式:

// 主进程
import {app, Menu, Tray} from 'electron';let tray = new Tray('public/icon.ico');
const contextMenu = Menu.buildFromTemplate([{label: '退出',click: function(){app.quit();}}
]);
tray.setToolTip('应用标题');
tray.setContextMenu(contextMenu);

在 Rubick 中,应用托盘实现的源码链接:GitHub - rubickCenter/rubick: 🔧 Electron based open source toolbox, free integration of rich plug-ins. 基于 electron 的开源工具箱,自由集成丰富插件。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/478448.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ubuntu解决“E: Unable to locate package lrzsz“

今天在ubuntu上安装rzsz包时报错,提示无法定位包,提示如下 出现这个问题是因为apt的源没有更新,我们直接说解决办法 把下面的命令执行一遍即可 sudo add-apt-repository main sudo add-apt-repository universe sudo add-apt-repository re…

GitHub仓库文件部署

目录 软件下载和安装 git创建仓库 Github仓库配置 git管理软件配置 Git管理 软件下载和安装 首先需要下载git,以及git管理软件,对其进行安装。 git创建仓库 首先需要创建仓库,在本地仓库文件夹cmd之后输入以下指令创建git仓库文件。 …

2024-2-19-IO作业

1> 要求: 源代码: #include <myhead.h> #define MAXSIZE 64 int main(int argc, char const *argv[]) {FILE *src NULL;FILE *dest NULL;if ((src fopen("./hbao.bmp", "r")) NULL){perror("fopen error");return -1;}if ((dest …

Vue | (三)使用Vue脚手架(上) | 尚硅谷Vue2.0+Vue3.0全套教程

文章目录 &#x1f4da;初始化脚手架&#x1f407;创建初体验&#x1f407;分析脚手架结构&#x1f407;关于render&#x1f407;查看默认配置 &#x1f4da;ref与props&#x1f407;ref属性&#x1f407;props配置项 &#x1f4da;混入&#x1f4da;插件&#x1f4da;scoped样…

150173-72-1,BODIPY 558/568 羧酸,一种疏水性荧光染料

您好&#xff0c;欢迎来到新研之家 文章关键词&#xff1a;BODIPY 558/568 羧酸&#xff0c;BODIPY 558/568 carboxylic acid &#xff0c;BODIPY 558/568 COOH&#xff0c;150173-72-1 一、基本信息 产品简介&#xff1a;BODIPY 558/568 COOH拥有高量子产率和消光系数&…

视频监控需求八问:视频智能分析/视频汇聚平台EasyCVR有何特性?

最近TSINGSEE青犀视频在与业内伙伴进行项目合作的过程中&#xff0c;针对安防监控可视化视频管理系统EasyCVR视频融合平台在电信运营商项目中的应用&#xff0c;进行了多方面的项目需求沟通。今天我们就该项目沟通为案例&#xff0c;来具体了解一下用户关心度较高的关于视频智能…

Eclipse - Makefile generation

Eclipse - Makefile generation References right mouse click on the project -> Properties -> C/C Build -> Generate Makefiles automatically 默认会在 Debug 目录下创建 Makefile 文件。 References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.net/

Redis 缓存(Cache)

什么是缓存 缓存(cache)是计算机中的一个经典的概念在很多场景中都会涉及到。 核心思路就是把一些常用的数据放到触手可及(访问速度更快)的地方&#xff0c;方便随时读取。 这里所说的“触手可及”是个相对的概念 我们知道&#xff0c;对于硬件的访问速度来说&#xff0c;通常…

Eclipse - Text Editors (文本编辑器)

Eclipse - Text Editors [文本编辑器] References Window -> Preferences -> General -> Editors -> Text Editors Displayed tab witdth: 4 勾选 Insert spaces for tabs 勾选 Show line number References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.n…

Gitlab操作流程

阶段1-构建账户信息 1.1 管理员分配账户 方式1-推荐 企业正常使用gitlab时&#xff0c;一般由项目经理(超级管理员)手动创建开发者账户信息&#xff0c;然后将账户发送给开发者&#xff0c;以便登录使用&#xff1b; 流程如下&#xff1a; 点击创建用户按钮&#xff1b; 创…

【教程】详解相机模型与坐标转换

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhang.cn] 由于复制过来&#xff0c;如果有格式问题&#xff0c;推荐大家直接去我原网站上查看&#xff1a; 相机模型与坐标转换 - 生活大爆炸 目录 经纬度坐标系 转 地球直角坐标系大地直角坐标系 转 经纬度坐标系地理坐标…

springboot+vue的宠物咖啡馆平台(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…