探索 Electron:窗口菜单以及生命周期和对话框讲解

Electron是一个开源的桌面应用程序开发框架,它允许开发者使用Web技术(如 HTML、CSS 和 JavaScript)构建跨平台的桌面应用程序,它的出现极大地简化了桌面应用程序的开发流程,让更多的开发者能够利用已有的 Web 开发技能来构建功能强大且跨平台的应用程序,这对于提升开发效率和应用程序的快速交付具有重要意义。

目录

窗口操作

自定义菜单

主进程生命周期

dialog对话框


窗口操作

在Electron中,窗口操作是非常重要的,开发者可以通过一些核心API来管理和控制应用程序窗口的行为,以下是对窗口内容的一些常见操作:

设置大小与位置:通过如下代码设置窗口的初始大小与在桌面的初始位置:

const createWindow = () => {const win = new BrowserWindow({ // 窗口的配置width: 800, // 设置窗口初始大小height: 600, x: 100, // 设置窗口初始位置y: 100,maxWidth: 1000, // 设置窗口最大最小宽高maxHeight: 800,minWidth: 500,minHeight: 400,resizable: false, // 设置窗口是否可以拖动改变大小,默认是true,设置false不允许进行窗口缩放了})win.loadFile('./src/index.html') // 加载页面
}

解决首页加载白屏: 在我们创建完窗口之后,窗口里面是没有加载内容的,内容是放在加载本地页面或者外部链接页面完成的,由于内容的加载和窗体的显示是异步执行不是同步的,所以可能看到类似于首屏加载会出现白屏的现状,这里我们可以采用下面的方式解决:

const createWindow = () => {const win = new BrowserWindow({ // 窗口的配置width: 800,height: 600,show: false, // 隐藏窗口,默认是truex: 100,y: 100})win.loadFile('./src/index.html') // 加载页面win.on('ready-to-show', () => { // 窗口准备就绪后,显示窗口win.show()})
}

窗口标题:如果想自定义窗口标题的话,可以将index.html中的title删除掉,采用如下的方式:

const createWindow = () => {const win = new BrowserWindow({ // 窗口的配置width: 800, height: 600, icon: 'logo.png', title: "亦世凡华、"})win.loadFile('./src/index.html') // 加载页面
}

如果想去掉窗口标题和菜单的话可以采用如下方式frame去掉边框,去掉之后窗口不再能拖动了,当然也可以设置窗口透明,不过很少用:

当然如果想隐藏掉原本自带的导航栏可以采用如下的属性进行:

自定义菜单

如果想对electron进行自定义菜单的设置的话,可以采用如下的方式进行,通过自定义菜单选项,设置一级二级菜单,让给菜单设置回调事件来实现菜单的自定义:

// app应用;BrowserWindow 窗口
const { app, BrowserWindow, Menu } = require('electron')const createWindow = () => {const win = new BrowserWindow({ // 窗口的配置width: 800, height: 600, icon: 'logo.png', title: "亦世凡华、",})win.loadFile('./src/index.html') // 加载页面
}// 自定义菜单选项
let menuTemp = [{ label: '文件', submenu: [{ label: '打开文件', click() {console.log("打开文件")} },{ type: 'separator' }, // 添加一个分割线{ label: '关闭文件夹' },{ label: '关于', role: 'about' },] },{ label: '编辑' },
]
// 利用上述的模板生成一个菜单选项
const menu = Menu.buildFromTemplate(menuTemp)
// 将上述的自定义菜单添加到应用里面
Menu.setApplicationMenu(menu)// 监听app的ready事件,当应用加载完成的时候,创建窗口
app.on('ready', () => {createWindow()
})

得到的效果如下所示:

当然菜单本身的role属性还分配了不同的角色,这里就不再一一赘述了,通过如下代码进行一个简单的演示:

// app应用;BrowserWindow 窗口
const { app, BrowserWindow, Menu } = require('electron')const createWindow = () => {const win = new BrowserWindow({ // 窗口的配置width: 800, height: 600, icon: 'logo.png', title: "亦世凡华、",})// 自定义菜单选项let menuTemp = [{label: '角色',submenu: [{ label: '复制', role: 'copy' },{ label: '剪切', role: 'cut' },{ label: '粘贴', role: 'paste' },{ label: '最小化', role: 'minimize' }]},{label: '类型',submenu: [{ label: '选项1', type: 'checkbox' },{ label: '选项2', type: 'checkbox' },{ label: '选项3', type: 'checkbox' },{ type: 'separator' },{ label: 'item1', type: 'radio' },{ label: 'item2', type: 'radio' },{ type: 'separator' },{ label: 'windows', type: 'submenu', role: 'windowMenu' },]},{label: '其它',submenu: [{label: '退出',width: 80,height: 60,// icon: 'logo.png',accelerator: 'CmdOrCtrl+Q', // 快捷键click() {app.quit()}}]}]// 利用上述的模板生成一个菜单选项const menu = Menu.buildFromTemplate(menuTemp)// 将上述的自定义菜单添加到应用里面Menu.setApplicationMenu(menu)win.loadFile('./src/index.html') // 加载页面
}// 监听app的ready事件,当应用加载完成的时候,创建窗口
app.on('ready', () => {createWindow()
})// 当所有的窗口都被关闭时,并且还不是苹果系统,则直接退出程序
app.on('window-all-closed', () => {console.log("第四步: window-all-closed-所有窗口都被关闭了")app.quit() // 退出程序
})

最终呈现的效果如下所示:

主进程生命周期

Electron应用程序的生命周期涉及到整个应用程序从启动到关闭的各个阶段和事件,这些阶段包括主进程和渲染进程的不同生命周期事件,以下是一个简要的概述:

应用程序启动:当应用程序启动时,主进程开始执行,并触发app模块的ready事件,在这一阶段,通常进行应用程序的初始化设置:

窗口创建与关闭:主进程通过创建窗口实例来展示用户界面,窗口的创建和关闭触发了一系列事件,如browser-window模块的ready-to-show、closed等事件:

应用程序激活和休眠:当应用程序从后台切换到前台时,会触发activate事件,应用程序进入休眠状态时,可以监听before-quit事件进行必要的清理工作:

退出应用程序:用户关闭所有窗口或者通过代码触发退出时,会触发window-all-closed和will-quit事件,允许应用程序执行最后的清理操作:

接下来我们通过代码对主进程生命周期进行一个简单的梳理:

// app应用;BrowserWindow 窗口
const { app, BrowserWindow } = require('electron')const createWindow = () => {const win = new BrowserWindow({ // 窗口的配置width: 800,height: 600,autoHideMenuBar: true, // 自动隐藏菜单栏})win.loadFile('./src/index.html') // 加载页面win.webContents.on('did-finish-load', () => { // 页面加载完毕后,执行回调函数console.log("第三步: did-finish-load-页面加载完毕")})win.webContents.on('dom-ready', () => { // 页面dom加载完毕后,执行回调函数console.log("第二步: dom-ready-dom加载完毕")})win.on('closed', () => { // 窗口关闭时,销毁窗口对象console.log("第八步: closed-窗口被销毁了")})
}// 当app准备完毕,创建窗口
app.on('ready', () => {console.log("第一步: ready-app准备完毕")createWindow()
})// 当所有的窗口都被关闭时,并且还不是苹果系统,则直接退出程序
app.on('window-all-closed', () => {console.log("第四步: window-all-closed-所有窗口都被关闭了")app.quit() // 退出程序
})
app.on('before-quit', () => {console.log("第五步: before-quit-准备退出程序")
})
app.on('will-quit', () => {console.log("第六步: will-quit-即将退出程序")
})
app.on('quit', () => {console.log("第七步: quit-退出程序")
})

从上文代码可以看出,所谓的app的生命周期就是我们在桌面上点击一个图标,那么app就会启动,启动完成之后会进行一些初始化操作,所以这里就需要ready准备,准备完成之后app就需要给我们进行展示特定界面也就是窗口,窗口有了之后它里面的dom元素就会进行dom-ready加载,页面加载完成然后我们再点击其中导航栏中的某个选项,这个时候某个选项dom加载完成之后会触发did-finsh-load的执行,点击关闭app窗口之后会执行closed,关闭所有窗口window-all-closed函数会被执行。

以下是具体的函数代码流程:

1)ready:app初始化完成

2)dom-ready:一个窗口中的文本加载完成

3)did-finsh-load:导航完成时触发

4)window-all-closed:所有窗口都被关闭时触发

5)before-quit:在关闭窗口之前触发

6)will-quit:在窗口关闭并且应用退出时触发

7)quit:当所有窗口被关闭时触发

8)closed:当窗口关闭时触发,此时应删除窗口引用

dialog对话框

在electron中dialog对话框可以显示用于打开和保存文件、警报等的本机系统对话框。这里对常用的dialog对话框函数进行一个简单的代码讲解:

showOpenDialog:用于显示一个打开文件或目录的对话框,让用户进行文件选择操作。

dialog.showOpenDialog({buttonLabel: '选择', // 设定对话框中选择按钮的显示文本为“选择”defaultPath: app.getPath('desktop'), // 设定默认路径为桌面properties: ['multiSelections','createDirectory','openFile','openDirectory'] // 设定选择类型为多选、新建文件夹、打开文件、打开文件夹
}).then((result)=> {console.log(result.filePaths) // 将用户选择的文件路径数组打印到控制台,以便开发者查看或进一步处理这些路径。
})

showSaveDialog:用于显示一个保存文件的对话框,并进行相应的操作。

dialog.showSaveDialog({title: "保存文件",defaultPath: 'test.txt' // 默认路径
}).then(res => {console.log("第一步: dialog.showSaveDialog", res)
})

showMessageBox:用于显示一个消息框并接收用户的选择。

const answers = ['Yes','No','Maybe']
dialog.showMessageBox({title: 'Message Box',message: 'Please select an option',detail: 'Message details',buttons: answers,
}).then(({ response }) => {console.log(`User selected ${answers[response]}`)
})

showErrorBox:用于显示一个简单的错误提示框。

dialog.showErrorBox('自定义标题', '当前错误内容')

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

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

相关文章

Python类与对象01

1、理解使用对象完成数据组织的思路 1.1类和对象的基本理解 理解类:从现实世界到编程世界 类由三个部分组成:类名、类的属性、类的方法。类的定义实际上是描述事物的一种方法,在现实世界中,事物都是有属性和行为的。通过类&…

JVM:类加载器

文章目录 一、什么是类加载器二、类加载器的应用场景三、类加载器的分类1、分类2、启动类加载器 四、双亲委派机制五、打破双亲委派机制六、JDK9之后的类加载器 一、什么是类加载器 类加载器(ClassLoader)是Java虚拟机提供给应用程序去实现获取类和接口…

休息时间c++

题目描述 小杨计划在某个时刻开始学习,并决定在学习k秒后开始休息。 小杨想知道自己开始休息的时刻是多少。 输入 前三行每行包含一个整数,分别表示小杨开始学习时刻的时h、分m、秒s(h,m,s的值符合1≤h≤12,0≤m≤59,0≤s≤59)…

Geoserver源码解读六 插件

系列文章目录 Geoserver源码解读一 环境搭建 Geoserver源码解读二 主入口 Geoserver源码解读三 GeoServerBasePage Geoserver源码解读四 REST服务 Geoserver源码解读五 Catalog Geoserver源码解读六 插件(怎么在开发模式下使用) 目录 系列文章目…

看番工具 -- oneAnime v1.2.5绿色版

软件简介 OneAnime是一款专为动漫爱好者设计的应用程序,它提供了一个庞大的动漫资源库,用户可以在这里找到各种类型的动漫,包括热门的、经典的、新番的等等。OneAnime的界面设计简洁明了,操作方便,用户可以轻松地搜索…

C++系列-Vector(一)

🌈个人主页:羽晨同学 💫个人格言:“成为自己未来的主人~” Vector的介绍及使用 Vector的介绍 当vector构建的参数类型为char类型时,它是和string是极其类似的,但是二者之间也有不同,比如&#xff0c…

[C++] 模拟实现list(二)

标题:[C] 模拟实现list(二) 水墨不写bug 目录 (一)回顾 (二)迭代器类的封装设计 (1)成员函数简要分析 (2)const迭代器类的设计 (…

二四、3d人脸构建

一、下载github项目3dmm_cnn-master https://github.com/anhttran/3dmm_cnn.git 一个使用深度神经网络从单个图像进行 3D 人脸建模的项目,端到端代码,可直接根据图像强度进行 3D 形状和纹理估计;使用回归的 3D 面部模型,从检测到的面部特征点估计头部姿势和表情。…

19185 01背包问题

解决这个问题的关键是使用动态规划的方法。我们可以创建一个二维数组dp[i][j],其中i表示考虑前i件物品,j表示背包的容量。dp[i][j]的值表示在考虑前i件物品,且背包容量为j时能获得的最大价值。 ### 算法步骤 1. 初始化一个二维数组dp&#x…

机器学习(五) -- 监督学习(7) --SVM2

系列文章目录及链接 上篇:机器学习(五) -- 监督学习(7) --SVM1 下篇: 前言 tips:标题前有“***”的内容为补充内容,是给好奇心重的宝宝看的,可自行跳过。文章内容被“文…

ABAQUS大连正版代理商:亿达四方——开启东北工业智能仿真新篇章

在东北老工业基地的振兴道路上,大连以其独特的地理位置和深厚的产业基础,成为推动区域经济发展的领头羊。作为国际知名的仿真软件ABAQUS在大连地区的官方授权代理商,亿达四方正以科技创新为驱动,引领当地制造业迈向数字化、智能化…

SD卡讲解

SD 卡 (Secure Digital Memory Card) 在我们生活中已经非常普遍了,控制器对 SD 卡进行读写通信 操作一般有两种通信接口可选,一种是 SPI 接口,另外一种就是 SDIO 接口。SDIO 全称是安全数 字输入/输出接口,多媒体卡 (MMC)、SD 卡、…

【Python实战因果推断】30_双重差分1

目录 Panel Data 在讨论了干预效果异质性之后,是时候转换一下思路,回到平均干预效果上来了。在接下来的几章中,您将学习如何利用面板数据进行因果推断。 面板数据是一种跨时间重复观测的数据结构。在多个时间段观察同一单位,可以…

构建实时银行应用程序:英国金融机构 Nationwide 为何选择 MongoDB Atlas

Nationwide Building Society 超过135年的互助合作 Nationwide Building Society(以下简称“Nationwide”) 是一家英国金融服务提供商,拥有超过 1500 万名会员,是全球最大的建房互助会。 Nationwide 的故事可以追溯到 1884 年&am…

web后端开发--请求响应

目录 前言 请求 简单参数 原始方法 Spring方式 Post请求乱码处理 实体参数 简单实体参数 复杂实体参数 ​编辑 数组集合参数 数组参数 ​编辑 集合参数 日期参数 ​编辑 Json参数 ​编辑 传递json数据 json数组 json对象(POJO) jso…

Dify中的知识库API列表

1.知识库API列表 通过文本/文件创建/更新/删除文档/查询文档嵌入状态,知识库创建/知识库查询/文档列表查询,分段增/删/改/查。 接口名字功能描述请求示例POST/datasets/{dataset_id}/document/create_by_text通过文本创建文档此接口基于已存在知识库&a…

tableau人口金字塔,漏斗图,箱线图绘制 - 13

人口金字塔,漏斗图,箱线图 1. 金字塔1.1 定义1.2 金字塔创建1.2.1 数据导入1.2.2 数据异常排查1.2.3 创建度量字段1.2.4 转换属性1.2.5 创建数据桶1.2.6 选择相关属性1.2.7 年龄排序1.2.8 创建计算字段1.2.9 选择相关字段1.2.10 设置轴排序1.2.11 设置颜…

liunx清理服务器内存和日志

1、查看服务器磁盘占用情况 # 查看磁盘占用大小 df -h 2、删除data文件夹下面的日志 3、查看每个服务下面的日志输出文件,过大就先停掉服务再删除out文件再重启服务 4、先进入想删除输入日志的服务文件夹下,查看服务进程,杀掉进程&#xff…

DW03D是一款用于锂离子/聚合物电池保护的高集成度解决方案。DW03D包含内部功率MOSFET、高精度电压检测电路和延迟电路

一般概述 DW03D产品是单节锂离子/锂聚合物可充电电池组保护的高集成度解决方案。DW03D包括了先进的功率MOSFET,高精度的电压检测电路和延时电路。 DW03D具有非常小的TSS08-8的封装,这使得该器件非常适合应用于空间限制得非常小的可充电电池组应用。…

【备战秋招】——算法题目训练和总结day3

【备战秋招】——算法题目训练和总结day3😎 前言🙌BC149简写单词题解思路分析代码分享: dd爱框框题解思路分析代码分享: 除2!题解思路分析代码分享: 总结撒花💞 😎博客昵称&#xff…