Electron 菜单

示例代码

一、自定义菜单

分成三个步骤

  1. 定义菜单内容
let menuTemp = [{
	label: 'File',
	click() {
	}
}]

其中数组里的每一项都是个 menuItem

  1. 根据上述的模板数据生成一个 menu
const menu = Menu.buildFromTemplate(menuTemp)
  1. 将上述的自定义菜单添加到 app 里
Menu.setApplicationMenu(menu)

示例:

// 在主进程 main.js 中
let menuTemp = [
	{
		label: 'File',
		submenu: [
			{
				label: 'New File',
				click() {
					shell.openExternal('https://kaiwu.lagou.com/')
				}
			},
			{
				label: '首选项',
				click() {
					BrowserWindow.getFocusedWindow().webContents.send('preferences')
				}
			},
			{
				type: 'separator'
			},
			{
				label: 'open File'
			},
			{
				label: '关于',
				role: 'about'
			}
		]
	},
	{
		label: 'Edit'
	},
	{
		label: '角色',
		submenu: [
			{ label: '复制', role: 'copy' },
			{
				label: '剪切',
				role: 'cute'
			},
			{
				label: '粘贴',
				role: 'paste'
			},
			{
				label: '最小化',
				role: 'minimize'
			},
			{
				label: '放大',
				role: 'zoomin'
			}
		]
	},
	{
		label: '四种类型',
		submenu: [
			{ label: '选项1', type: 'checkbox' },
			{ label: '选项2', type: 'checkbox' },
			{ label: '选项3', type: 'checkbox' },
			{ type: 'separator' },
			{
				label: 'item1',
				type: 'radio'
			},
			{
				label: 'item2',
				type: 'radio'
			},
			{
				label: 'Windows',
				type: 'submenu',
				role: 'windowMenu'
			}
		]
	},
	{
		label: '其他',
		submenu: [
			{
				label: '打开',
				icon: './file.ico',
				accelerator: 'Ctrl + o',
				click() {
					BrowserWindow.getFocusedWindow().webContents.send(
						'mtp',
						'主进程发送消息给渲染进程'
					)
				}
			}
		]
	}
]
// 2.根据上述的模板数据生成一个 menu
const menu = Menu.buildFromTemplate(menuTemp)
// 3.将上述的自定义菜单添加到 app 里
Menu.setApplicationMenu(menu)

运行显示如下:

在这里插入图片描述

二、动态创建菜单

分成如下步骤

  1. 实例化个 Menu
let menu = new Menu()
  1. 实例化个 menuItem
let menuFile = new MenuItem({ label: '文件', type: 'normal' })
  1. 将创建好的自定义菜单添加至 menu
menu.append(menuFile)
  1. 设置菜单 menu
Menu.setApplicationMenu(menu)

示例:

<!DOCTYPE html>
<html lang="en">
	<body>
		<h2>自定义菜单</h2>
		<button id="addMenu">创建自定义菜单</button>
		<br />
		<br />
		<input type="text" placeholder="输入自定义菜单项内容" id="menuCon" />
		<br />
		<br />
		<button id="addItem">添加菜单项</button>
		<script src="./index3.js"></script>
	</body>
</html>
const { Menu, MenuItem } = require('@electron/remote')

window.addEventListener('DOMContentLoaded', () => {
	let addMenu = document.getElementById('addMenu')
	let menuCon = document.getElementById('menuCon')
	let addItem = document.getElementById('addItem')

	let menuItem = new Menu()
	// 生成菜单
	addMenu.addEventListener('click', () => {
		let menuFile = new MenuItem({ label: '文件', type: 'normal' })
		let menuEdit = new MenuItem({ label: '编辑', type: 'normal' })
		let customMenu = new MenuItem({ label: '自定义菜单项', submenu: menuItem })

		// 将创建好的自定义菜单添加至 menu
		let menu = new Menu()
		menu.append(menuFile)
		menu.append(menuEdit)
		menu.append(customMenu)

		Menu.setApplicationMenu(menu)
	})
	addItem.addEventListener('click', () => {
		const value = menuCon.value.trim()
		if (value) {
			menuItem.append(new MenuItem({ label: value, type: 'normal' }))
			menuCon.value = ''
		}
	})
})

动态创建表单

详见示例里的 index3

三、右键菜单

前面两步跟自定义菜单一样

  1. 定义菜单内容
let contextTemp = [
    { label: 'Run Code' },
    { label: 'Go to defination' },
    {
        type: 'separator'
    },
    {
        label: '其它功能',
        click() {
            console.info('其它功能选项被点击了')
        }
    }
]
  1. 根据上述的模板数据生成一个 menu
let menu = Menu.buildFromTemplate(contextTemp)
  1. 监听 contextMenu 事件,并使用 menu.popup 函数
window.addEventListener(
    'contextmenu',
     (ev) => {
         ev.preventDefault()
         menu.popup({ window: getCurrentWindow() })
     },
     false
)

menu.popup([browserWindow, x, y, positioningItem])

  • browserWindow BrowserWindow (可选) - 默认为 null.
  • x Number (可选) - 默认为 -1.
  • y Number (必须 如果x设置了) - 默认为 -1.
  • positioningItem Number (可选) OS X - 在指定坐标鼠标位置下面的菜单项的索引. 默认为 -1.

browserWindow 中弹出 context menu .你可以选择性地提供指定的 x, y 来设置菜单应该放在哪里,否则它将默认地放在当前鼠标的位置.

示例:

const { Menu, getCurrentWindow } = require('@electron/remote')

let contextTemp = [
	{ label: 'Run Code' },
	{ label: 'Go to defination' },
	{
		type: 'separator'
	},
	{
		label: '其它功能',
		click() {
			console.info('其它功能选项被点击了')
		}
	}
]
let menu = Menu.buildFromTemplate(contextTemp)
window.addEventListener('DOMContentLoaded', () => {
	window.addEventListener(
		'contextmenu',
		(ev) => {
			ev.preventDefault()
			menu.popup({ window: getCurrentWindow() })
		},
		false
	)
})

详见示例里的 index4

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值