门店宣传不用愁,知了知屏海量素材,一键上屏
餐饮作为市场竞争最激烈的行业之一,在不断地进行迭代更新,各类品牌的宣传方式也层出不穷,海报、展板、展架等随处可见。而现在,屏幕营销似乎也成为了一种新的宣传形式,几乎所有的奶茶、快餐门店都拥有2~5台屏幕,用于轮播海报、菜单、视频广告等,比起静态的宣传方式,有“声”有“色”的屏幕似乎更能展现产品的魅力和品牌的风采。
那么在如此庞大的市场里,在如此激烈的竞争之下,餐饮行业该如何玩转屏幕,做出让人耳目一新的广告,抢占先机,让产品脱颖而出呢?知了知屏带您探索动态营销的捷径。
当季新品 动动小手 一键更新
许多门店使用的是”电视机 + U盘”的形式来进行广告的播放,更新内容时常常需要下载大量资料在U盘,耗费了大量时间,甚至会耽误新品的更佳上架时间。而使用“电视机 + 知了知屏”,就能解决这个问题,只需将资料上传一次,然后发布即可,无需守在设备旁边,只用一台手机或者电脑,远程即可更新内容。新品海报一键上屏,极速更新。
动效菜单 随时修改 实时更新
知了知屏的动态场景库中有不同类型的菜单模板,无需设计,简单编辑即可使用;即便菜单条目有所改动,也只用修改部分组件,不必再重新 *** 菜单。
打折促销 大屏投放 夺人眼球
一些打折促销的产品,可能需要尽快出售,这个时候用大屏投放是效果更好的,可以有效吸引路人眼球,引导客人进店购买,从而提升店铺销量。如果没有专门的设计师来 *** 海报,知了知屏的素材库也提供了大量的促销海报,涵盖各个行业,满足不同需求。
节日限定 精美海报 即刻上屏
节假日通常是营销的重要节点,节假日的人流量更多,热度也更高,受节日氛围的影响,人群的购买力也会增加,所以打好节假日战役是非常重要的。知了知屏会在每个节假日在首页推送精美动效海报,助力商家做好节日活动,海报无需设计,只需轻轻一点,就能一键上屏,大大节省商家成本与设计时间。
多台屏幕 统一控制 方便管理
对于拥有多台屏幕的商家来说,知了知屏也可以协助进行屏幕管理。在后台即可巡查屏幕,屏幕的播放状况、运行时长、排期、 *** 状况都一目了然;还可以远程对屏幕进行操作,可以远程要酷、重启应用、截屏当前播放内容等,方便管理。
300款菜单模板送给大家,全是psd文件
菜单的设计本身就是一门艺术,是技术较强而又细致的工作。由于各个餐馆的档次和经营内容不尽相同,设计会多种多样。
免费领取提示:
国外菜单设计欣赏!点餐必备
5个精美、免费的ppt模板网站,满足你所有的ppt *** 需求
今天,魏姑娘在应上级要求做部门PPT时,打 *** 过来问我有没有什么靠谱的PPT模板网站推荐,还提了一大堆要求:免费的,质量高的,没有广告的...
相信很多人在平时的工作中,当要 *** PPT时,和魏姑娘一样会直接套用模板,不但省时省力,而且效果极佳。但去某度搜索时,出现的模板网站良莠不齐,有的网站模板看着就很低级,有的网站广告满天飞,还有的网站甚至在下载时存在捆绑软件,质量稍微好点的、被大家熟知的模板网站也基本都存在收费清空。
为避免寻找模板过程中造成的困扰,本文为大家搜罗6款高质量精美且免费的PPT模板网站,建议收藏。
HiPPTer——最全PPT模板网站导航
HiPPTer是一个PPT模板网站的集大成者,无论是小众的还是大家熟悉的、国内的还是国外的、免费的还是付费的模板网站,在HiPPTer里都包含。总的来说,有了这一个导航网站,就不需要一个一个去收藏网址了。
站内收录的模板站都会有一个简单的介绍,是否收费、网站类型、网站功能都会在下方标注,大家在浏览时可根据自己的需求挑选,如果一个不合适,换另外一个就好了嘛。
PPT模板质量非常高,且很多更新及时,所以不用担心下载的模板是好几年前的 *** 、用起来会拉低逼格。随便点开一个网站,以pptfans为例,可以看到模板水准质量非常高。如果有找模板的需要,这个导航网站绝对是首选。
OfficePLUS——微软官方模板网站
非常好用的一款正规官方出品的免费office模板网站,虽说谈不上特别精美,但是非常实用,模板下载方便,鼠标放在喜欢的模板上会出现预览与下载按钮,点击即可下载。同时,OfficePLUS现在已经推出插件版本,下载插件安装到电脑上会自动匹配到PPT菜单栏, *** 时直接调用即可,用起来非常方便。
微软官方出品模板网站当然不止有PPT模板,同时还要Word模板、Excel模板,相比于PPT模板,Word和Excel的模板可能对很多人来说更实用一些。
优品PPT——精美PPT模板下载网站
优品PPT,里面不仅有免费高质量的模板,而且还有PPT图表、PPT背景素材的单独下载。如果你想独立完成PPT *** ,但背景素材又不知道如何配,可以在里面只下载背景素材使用,或者对于你来说PPT中图表的 *** 太过麻烦,可以走在图片模块中仅仅下载图表使用,非常方便快捷。
PPT图表模块中的图表示例:
PPT背景模块中的图片示例:
51PPT模板网——免费PPT模板网站
51PPT模板网是一个被界面设计耽误的高质量、免费模板网站,或许是个人运营的站长将全部的精力都用在了为大家寻找优质模板上,导致网站首页看起来不那么高大上,但并不影响其网站质量,反而站内提供的免费PPT模板质量都非常高,值得去下载。
高质量PPT模板示例:
比格PPT——精选PPT模板网站
比格PPT网站,同样是一个个人运营的模板网站,站内有PPT模板、教程、素材、软件分享,模板质量同样优秀,且免费下载
PPT模板示例:
对于高质量免费PPT模板网站就先分享这么多,有什么疑问欢迎在评论区留言。
欢迎关注我的头条号,获取更多实用、优质内容~~
1289套美食菜单模板送给大家!psd文件
今年上半年因为新冠肺炎的影响,餐饮业损失惨重。不过随着疫情的慢慢好转,餐饮业也开始逐渐复苏,我们又可以去吃吃吃啦!(资源获取方式见文末)
民以食为天,如今我们在吃的方面真可谓是丰富多彩,各种美食应有尽有,火锅酸菜鱼麻辣烫!,只有你们想不到的,没有吃货不敢吃的。
当然,各大餐馆、饭店、美食城对于菜单的设计也是极尽所能的创新、创新、再创新。不止是为了打响名气,更是为了能够满足受众的眼福和口福
所以在菜单的设计中,也是费尽了不少设计师的心血,今天给大家分享的模板中,就有不少精品
无论是用来套模板还是临摹学习。都是极好的呢
希望大家能在大师的作品中,吸收经验,感受大师们的设计水平。同时也能在日后的工作中给同学们更多的启发。
这1289套美食菜单PSD源文件的收集整理方面,在收集整理的过程中可是费尽了功夫,三天三夜没合眼,就冲着这些美食,也是乐此不彼的。
1289套美食创意菜单PSD源文件模板免费领取提示:
1、评论留言:吃不胖
2、私信发我:芝麻开门
J-SyS TOC生产管理学习模拟软件 —— 模板 *** 说明
J-SyS TOC生产管理学习模拟软件,是对TOC的传统G-SIM学习模拟器的最新成果反映,包括经典G-SIM的部分学习模拟模板,MTA学习模拟,MTO/MTA学习模拟。 也带了一个自定义生产管理模拟模板的 *** 功能,用户可以自行定义或按自己企业的工艺路线定义模板,供自己企业学习使用。
本说明是对【模板 *** 】功能的说明帮助。
1、启动软件
通过输入网址,打开登录页面:
说明: 1、可选择语言切换,目前准备了中、英、日三种语言
2、按要求输入公司(4位代码)、用户ID、密码
3、点击【登录】,登录系统
4、个人用户可自行定义编辑模板
企业用户需在企业管理员授权下方可使用编辑模板功能
2、打开自定义编辑模板功能
说明: 1、点击左侧菜单【模板 *** 】打开模板 *** 画面。
3、模板编辑
3-1、模板编辑的主要画面
画面分为:
主要的材料和工序区域,更大支持9种原材料,9层工艺路线;
机器/资源组设置区域,每工序更大支持3种机器/资源组;
- 对机器双击,会在【空白】(取消机器)- 【显示】(代表增加机器)切换
机器/资源组名称颜色设置区域,可按需自行设定;
主要操作按钮区:设置节点,设置模板信息,保存模板,设置设备故障率等。
3-2、游戏模板的基本信息参数设置
1)游戏天数:游戏时长,共运行多少天;例如完美工厂游戏36天,MTA游戏40天等
2)工作时间:单位为小时,8代表8小时
3)初始金额:代表游戏开始前所拥有的现金,随着材料采购和每周支付固定费用,
将会自动扣除;根据游戏执行情况会挣钱补充
4)日结果: 是否自动弹出日结果页面
5)运营费用: 周单位固定费用,到期需要支付,从现金扣除
3-3、增加和设定游戏节点
拖动【增加节点】按钮,相应的拖到所需要增加节点的行列,释放,以增加节点。
【RM】:代表原材料,用管材图标来显示
【1-9】:代表制造工序,用带数字的圈及代表WIP在制库存图标来显示
【库存/Stock】:代表产品在仓库的库存数量,附带在第9个工序图标上
【需求/Demand】:代表按单生产MTO产品的市场需求
【消耗/Consumption】: 代表按库存生产MTS产品的市场需求
需求和消耗,可另行单独设置每日市场随机需求
3-4、连接节点,设置材料、工序、组装、成品的连接加工物流信息
在每个节点的连接点上用鼠标拖拽到另外一个节点的连接点上,把物料-工序-
产成品串联起来
3-5、设置初始材料存货数量,和采购单价
3-5、设置工序参数
数量:代表初始在制品数量
生产时间(分钟):代表单位生产时间
单位生产数:前道材料生产本工序产品的单位产出数(1出几)
机器类型: 选择相应的加工设备资源
准备时间(分钟):加工切换时间
批量数:代表最小批量,只有前道工序的WIP在制满足此批量,才会开始加工
故障恢复时间:若机器发生故障其修复时间
3-6、设置按单生产的市场信息及需求
单价:代表产品的销售价格
倍数:计算制造前置时间结果时的加乘系数
安全系数:安全系数
产品的优先顺序:用来计算期末在制的分配规则
订单输入:按照交期和需求数量,游戏设计者预先销售订单输入
3-7、设置按库存生产的市场信息及需求
单价:代表产品的销售价格
之一天的目标库存:初始之一天目标库存
产品的优先顺序:用来计算期末在制的分配规则
每日消耗量输入:
系统预设了随机输入模式,供辅助输入,用户可自行修改
按照ABC分类,设定不同的浮动率,随机生成
3-8、设置机器的随机故障率
在工具按钮区点击【设置故障率】按钮,打开故障率设置画面,可通过随机设置辅助
3-9、设置模板的名称和相关的说明
4、模拟试行,确认该模板
5、修改该模板(点击4中的修改该模板,基本操作参考3)。
(完)
收下这些实用模板,帮你把 Notion 打造成全能助理
目录
- Notion 官方模板库
- 第三方模板库 Notion Pages
- 创建自定义模板
将笔记、任务管理及知识库相结合,Notion 打造出了一款「瑞士军刀」般的协作工具。或许你曾被许多人推荐过 Notion,但却不知道从何下手。又或者你已经上手了 Notion,却碍于想象力不知如何挖掘它的潜力。
Notion 在不久前的更新中上线了 官方模板库,支持了 模板复制功能,我们也能在 Notion Pages 等第三方网站中找到不少使用模板。本文为你整理了 10 个优质 Notion 模板,它们可以带你从零开始走进 Notion,或是开发你的想象力,让你创建出属于自己的实用模板。
Notion 官方模板库
要说谁最了解 Notion,那么答案肯定是它自己。Notion 的 官方模板库 里涵盖了从个人生活到团队协作各方面的模板,对 Notion 功能也应用得十分深入,我们可以直接套用。除了 Notion 官方出品的模板外,这里也收录了不少来自社区用户的优质模板。
个人/团队主页:Personal/Team Home
如果你想将 Notion 打造为自己的工作区,你肯定希望所有页面都能井井有条地整理好,在你需要时,可以迅速找到特定页面。这时候,一个可以将所有页面分门别类放置好的主页显得尤为重要。
Notion 官方为我们分别准备了 个人主页 和 团队主页 的模板,我们可以参照它来布局自己的 Notion 主页。
这个模板的原理并不复杂,仅仅是用标题(Header)和页面(Page)将不同类别的页面归纳好,让你的工作区变得更有条理。主页模板的用法也非常简单,只要按照一定的格式将页面整理好,就能得到一个井井有条的主页。
追踪游戏进度:Video Game Tracker
Video Game Tracker 是一款来自社区的优秀模板,它可以用于追踪游戏的进度。除了游戏外,你也可以用它来追踪正在看的电影、书籍。随着《复仇者联盟 4:终局之战》的上映,不妨用这个模板来追踪自己补电影的进度。
要在画廊中添加内容,只要点击右上角的「新建」(New),随后在弹出的窗口中填写游戏所在的平台、价格等信息即可完成将卡片收入画廊。如果你想用它来追踪阅读进度,也可以通过「添加类目」(Add a Property)来自定义模板。
Video Game Tracker
这个模板用到了 Notion 的「画廊」(Gallery)功能,它可以让我们快速查看多张卡片的概要内容。配合封面图,你可以一目了然地分辨出不同卡片的内容。画廊也支持添加过滤选项,我们可以把所有卡片按照特定的规则筛选出来。你可以在画廊右上角的菜单键中找到「过滤器」(Filter)的选项,并创建自己的过滤规则。
人际关系管理:Intentional Relationship Aid
在当今社会,人与人之间的关系逐渐疏远。我们的微信里添加了许多好友,可真正有交集的却寥寥无几。Intentional Relationship Aid 是用于管理人际关系的一个模板,它可以帮助我们清晰地查看到自己与好友的互动情况。
这个模板用到了 Notion 的表格(Table)及函数功能(Formula),表格可以让我们清晰地看到所有好友的姓名、关系和联系频率等信息。每一行代表一个好友,点击好友名称即可打开一个单独的页面,你可以在这里添加好友的联系方式或是照片。
Intentional Relationship Aid
这个模板还通过函数做出了「近期联系的可能性」及「多久联系一次」的推算,它将根据你为好友设置的联系频率和上次联系时间进行运算。作者将具体函数放在了模板中,你可以查看并根据自己的需求进行修改。
个人财务管理:Personal Finances
Personal Finances 是一款个人财务管理的模板。你不需要拥有相关知识,只需要按照自己的需求对它的内容进行简单修改,就能得到一个自己的财务管理页面。
这个模板分为三个部分:
- 文字信息:用于放置消费目标、超支金额等文字内容。
- 消费流水:以日历形式呈现每日的消费流水,可以清晰查看到消费内容与金额。
- 每月消费:以看板形式呈现每月消费,可以根据分类进行过滤筛选。
你可以随意修改文字信息,用它来做一个简单的消费计划。要添加消费流水,只需要点击日历右上角的「添加」,随后填入金额、日期等信息即可。你还可以选择消费的方式,比如订阅、预付费或是一次性付费。
Personal Finances 模板用到了日历(Calendar)及看板(Board)功能,让我们可以通过不同的方式查看到自己的消费情况。即使你不需要进行财务管理,也可以学习它的思路,打造一个 *** 日历与看板的任务管理工具。
目标进程追踪:OKRs
OKR(Objectives and Key Results,即目标与关键成果法)是用于跟踪目标的工作法,许多团队都会用它来明确自己的目标及关键成果。OKRs 就是根据 OKR 工作法所 *** 的 Notion 模板。
OKRs 通过行内表格的方式来实现目标管理,点击项目名称即可设置目标的参数。设置完成后,你可以在表格中看到当前的数值和完成进度,你也可以随时修改当前数值,进度会自动随之改变。
OKRs

OKRs 比较亮眼的一点是它用到了模板按钮(Template Button),你只需要点击「添加 OKR」即可快速添加一个新的表格,而不用从头创建新的表格。模板按钮可以用于快速创建模板化的内容,十分方便。
看板式任务管理:Tasks and Issues
Tasks and Issues 是 Notion 官方提供的一个看板式任务管理模板,如果你用过 Trello 或 Teambition,相信你对这个模板不会陌生。看板式任务管理可以让我们更加清晰地看到每个任务的执行情况。
这个模板不但支持对任务进行分类管理,还支持多人协作,你可以将任务分配给相应的同事。此外,你也可以通过自带的过滤器来筛选出分配给自己的任务。你也可以将其打造成自己的任务管理系统,时刻追踪任务完成情况。
在看板的时间设置中,你也可以添加提醒,让自己不再错过重要的任务。
会议记录:Meeting Notes
Meeting Notes 是一个会议记录的模板,它将以列表的形式把会议记录整理起来,你可以清晰地看到与具体会议相关的人员、部门。每一个会议都是一个单独的页面,你可以在页面中进行会议记录和归纳。
会议记录同样支持过滤,你可以按照部门、时间等条件筛选出符合规则的记录。除了套用这个模板进行会议记录外,我们也可以在这个模板的范例里学习到一些会议记录的方式和技巧。
第三方模板库 Notion Pages
虽然官方模板库考虑的较为全面,但它的缺点就是模板不够个性化、生活化。如果你想找一些更加生活化的模板,不妨试试 Notion Pages 这个第三方模板库。
旅行计划:Travel Plan
在出门旅游前,制定一套详细的计划可以让我们的旅途更有条理。Travel Plan 是一款用于制定旅游计划的模板,包含了日程安排、景点介绍和检查清单等内容。这些内容都是以页面呈现的,你可以根据需求对其进行高度自定义。
Notion 非常适合用来做旅行计划。由于我们可以在 Notion 中添加 Google 地图的位置、路线等信息,在外出旅游时,只需打开 Notion 就可以明确地知道酒店、景点的位置以及路线。
调查项目管理:Research Project
无论你是学生党还是上班族,相信你都离不开调查。Research Project 就是一个用于管理调查项目的模板,你可以用它来管理自己的调查项目。模板将调查所需要的步骤设为单独的页面,通过文字底色来标注状态。
你可以直接套用这个模板,简单修改后用来管理调查项目。当然,你也可以学习它的标注方式,比如用文字底色来代替标签,让当前状态看起来更直观。
子弹笔记:Bullet Journal
子弹笔记俨然已成为许多人的心头好,与其单独为子弹笔记下载一个应用,不如用 Bullet Journal 把子弹笔记放进你的 Notion。比起子弹笔记,这个模板更像是一个人生规划本。
模板默认在左侧提供了人生目标,你可以在右侧按照不同的类别来管理自己的计划,记录自己的灵感。你也可以根据自己的喜好将它修改成自己喜欢的模样。
模板在底部提供了归档箱,你可以将已经完成的目标、已经过去的月份收纳于此。你也可以尝试将「归档」这个操作添加到其他页面,将过期的、已完成的内容归档,让页面看起来更加干净。
创建自定义模板
每个人的生活都大不相同,再多的模板也很难满足每一个人最细致的需求。如果你对 Notion 有着极高的个性化需求,同时又了解 Notion 的许多功能,不妨试试创建一个属于自己的模板。
官方提供了创建模板的 图文教程,但仅提供了英文版。本文将根据官方教程来介绍如何创建 Notion 模板。
创建模板按钮
Notion 提供了两种在页面中创建一个模板按钮,一是在添加按钮的菜单中点击「Template Button」,二是在空白位置输入 /,再输入 Template Button 来添加。无论哪种方式,最后都会生成一个设置菜单。我们可以在菜单中设置按钮名称和模板内容。
设置模板内容
在模板内容设置框中,你可以直接将页面内的模块拖进去,当然也可以在里面直接创建新的模块。如果你创建的是一个页面,你也能跳转到页面进行编辑,它也将成为模板的一部分。
完成模板的编辑后,点击设置菜单的「关闭」(Close)即可生成模板按钮。你可以随时修改按钮的内容,点击最右侧的设置键即可展开设置菜单。
使用模板按钮
模板按钮的使用 *** 不需过多赘述,点击即可生成模板内容。但模板按钮应该用在哪里,是许多人初上手时会遇到的问题。
以我个人为例,我在 Notion 里以表格的形式做了自己的文章索引,按月份来归类。这也就意味着我需要重复做多个相同的表格,并放到不同月份的页面下,并且需要单独调整表格的标签、行列,十分复杂。
而有了模板按钮,我只需要 *** 一份模板,即可快速生成一个表格页面。我要做的只有将内容填入表格,大大提升了工作效率。同时,由于是模板化的页面,表格的标签、行列都一模一样,视觉上也更加美观。
如果你有什么 Notion 的使用技巧或是优质模板想要推荐,不妨在评论区与我们一起分享。
用Axure做一个产品需求文档(PRD)模板
今天给教大家用axure做一个产品需求文档(PRD)模板,其中包括目录,版本修订记录,产品概述,功能说明,全局说明,非功能性说明。该原型模板使用简单,交互完善,直接修改文字即可。喜欢该原型的小伙伴们可以在评论处给我留言哦。
原型预览地址:https://n3j71h.axshare.com
*** ***
1. 目录我们 *** 一个左侧菜单作为目录,具体 *** *** 可以参考我之前的文章:AXURE教程:三级菜单和标签的交互使用
2. 版本修订记录版本修订记录包括版本号、修订日期、修订内容、、修订人、审核人和状态。
*** *** 简单,只需要用axure自带的表格原件,样式修改的好看一点即可。
3. 产品概述这部分主要是介绍产品的背景、功能、价值、架构,以及解决了用户哪些痛点,以及产品是如何解决这些痛点的。
(1)产品介绍
这部分内容可以简单的介绍一下产品的背景、机遇和价值。
这部分 *** 也简单,只需要做文本标签即可。
(2)产品用户
这部分主要介绍一下,该产品的目标用户。主要可以从以下方面介绍,包括用户类型,用户的地区、性别和年龄分布。
用户类型:用axure自带表格即可 *** 。
地区、性别、年龄分布建议使用可视化视图来做,这样的效果更佳清晰。具体可以参考我之前的文章 Axure教程:可视化视图
*** 完成后可视化视效果:
(3)用户需求
用户需求的话需要记录用户故事和需求描述,以及该需求的状态和优先级。和上边一样只需要用表格 *** 即可。
(4)功能清单
功能清单是为了满足用户提出的需求所具备的功能列表。清单主要包货功能模块、功能点、功能描述和优先级。
*** *** 和上边一样只需要用表格 *** 即可。
(5)产品架构图
产品架构图主要包括功能机构图和信息架构图。
我们需要用文本框+连线,需要一点心思才能做出好看的样式。原件里的大家可以直接使用,只需改动文字即可。
(6)名词解释
名词解释是对专有名词的解释,为了让阅读prd的人更容易理解。
同样的 *** *** 我用表格 *** 即可。
4. 功能说明这部分是对功能清单的功能点详细的说明,需要包含功能说明,原型图,流程图等。
(1)原型
这里摆上你们自己 *** 好的原型就好的,建议有交互效果的,这样开发一目了然。由于时间的原型,作者这个文档就没有做出交互。
(2)功能说明
每个功能点建议大家要标明出来,然后在右侧详细说明。
(3)流程图
这个看需要,可要可不要,如果逻辑较复杂的建议加上,大家直接用axure的图形和连线 *** 即可。
下面作者以某打车软件的功能点展开。
5. 全局说明全局说明包括:权限说明、授权说明、异常情况、键盘说明、字段规则等等。有的文档把字段规则放到上面的功能里面,也是可以的,大家可以根据公司习惯修改。
权限说明主要是对角色权限进行划分,我们简单用表格 *** 即可。
授权说明、异常情况、键盘说明,需要用demo来展示,其中键盘说明,可以参考我之前的文章AXURE教程:手机键盘 *** 。
字段规则,是对输入输出项规则的秒速,包括字段名称,是否为必填项,数据类型,字段长度,提示文字和备注规则等等。
我们也是简单的用表格来完成即可。
6. 非功能性需求这部分是对产品非功能性需求的说明,包括技术组件需求、性能需求、安全需求、系统要求、可用性需求等等。
我们也是简单的用表格来 *** 即可。
今天的这里就结束了,喜欢原型或者有疑问的小伙伴们可以在下方评论处给我留言哦,我们下期见。
本文由 @梓贤Vigo 原创发布于人人都是产品经理。未经许可,禁止转载
题图来自 Unsplash,基于CC0协议
这个模板太好用了吧 #剪辑教程
今天教大家做一键解锁看照片的视频。
·首先在素材库导入背景,搜索解锁贴纸,还可以加入其他觉得好看的贴纸,只要拍的好看就行。
·在音频中添加一个解锁的特效,摆放至合适位置,点击画中画,添加萱萱可爱照片,对齐到前面解锁完成的贴纸后面,缩小一点方便观看。
·点击你想要抠的图片,在下面的菜单栏中找到抠像,智能抠像,描边抠像,你看想抠哪一张?这种有蒙版照片,先选中照片,然后点击蒙版,你想把照片弄成哪种形状就点哪个就行,可以调节宽度和高度还有弧度。剩下的就是自己调调位置,加一些好看的贴纸,添加音乐,把贴纸和照片的长短根据音乐对齐。
·最后添加一个泡泡变焦的画面特效,作用范围选全局就行。
是不是很简单?赶快去学起来吧!
《Electron实战》中文版:构建应用程序菜单及上下文菜单
本文为《Electron实战》中文版第7章内容,私聊得样本电子书。
本章包括
- 使用Electron的Menu和MenuItem模块创建菜单
- 通过模版构建菜单
- 为目标操作系统自定义菜单
- 为菜单项分配通用操作系统角色
- 使菜单项具有自定义的、特定于应用程序的功能
- 为界面不同部分创建自定义的上下文菜单
在基于浏览器的应用程序中,开发人员只能访问应用程序窗口的可见区域,不能向浏览器的工具栏或菜单栏添加控件,应用程序的整个功能界面必须位于窗口内。开发人员同样在窗口内面临一些限制,不能修改右键单击界面时出现的上下文菜单,为每个选项和命令找到一个合适位置可能是一个挑战。而Electron则使开发人员能够在浏览器窗口之外添加功能,例如当用户右键单击界面组件时出现的自定义应用程序和上下文菜单。
在本章中,我们将探讨如何在Fire Sale中创建和配置这些菜单。我们将用自己的菜单替换Electron提供的默认菜单,并在菜单中展示常见的操作系统功能。我们将给菜单项分配快捷方式,以便在应用程序的任何位置都能触发它们。在实现了基本的菜单功能之后,我们将添加我们自己应用程序所特定的菜单项——特别是,能够从文件系统中打开Markdown文件,在界面左侧窗格中显示其内容,并在右侧窗格中将其内容呈现为HTML的功能。最后,当用户在左侧窗格中单击右键时,我们创建一个自定义上下文菜单,其中包含常见的文本操作任务(剪切、复制和粘贴,如图7.1所示)。
图7.1 本章,我们会构建能触发界面功能的自定义菜单项。
在前几章中,我们已经在Fire Sale中实现了一个菜单。那么为什么现在还要定制呢?开发人员可以覆盖Electron的默认菜单,但是他们需要从头开始构建。在本章,我们会还原大多数桌面应用程序常见的基本功能。在打下基础之后,我们再使用自定义功能对其进行扩展。例如,用户可以通过菜单保存当前活动的文件,以及将HTML导出到单独的文件。除了能够从应用程序菜单中访问此功能外,用户还可以使用快捷键来触发菜单项。在本章,我们会构建一个Fire Sale菜单,其结构如图7.2所示。
7.1. 仿制并替换默认菜单
首先创建一个名为./app/application.js的新文件,到本章结束时,这个文件将会变得很大,因此我们现在就把它分拆成独立的文件。我们先从复制、粘贴菜单开始。
代码清单7.1 :创建带有复制和粘贴功能的编辑菜单:./app/application-menu.js
const { app, BrowserWindow, Menu, shell } = require('electron');const mainProcess = require('./main');const template = < { label: 'Edit', submenu: < { label: 'Copy', accelerator: 'CommandOrControl+C', role: 'copy', }, { label: 'Paste', accelerator: 'CommandOrControl+V', role: 'paste', }, > }>;module.exports = Menu.buildFromTemplate(template);
下一步,当应用程序触发ready事件时设置菜单。
代码清单7.2 :从应用程序文件中加载菜单:./app/main.js
const { app, BrowserWindow, dialog, Menu } = require('electron');const applicationMenu = require('./application-menu');const fs = require('fs');const windows = new Set();const openFiles = new Map();app.on('ready', () => { Menu.setApplicationMenu(applicationMenu); createWindow();});// ... Additional methods below ...
Electron有Menu和MenuItem模块可用于构建菜单。理论上,我们可以只用MenuItem就可以构建一个菜单,但这种 *** 可能很繁琐,且容易出错。为了方便起见,Menu模块提供了buildFromTemplate() *** ,该 *** 接受一个常规的JavaScript对象数组。Electron会在内部根据你所提供的数组来创建菜单项。
7.1.1. macOS与缺少编辑菜单的情况
如果在Windows中启动应用程序,应该会看到一个“编辑”菜单,不出意外的话,其中会有两个菜单项:复制和粘贴。但如果你在macOS上测试应用程序,结果会有些不同,如图7.3所示。
在macOS中,菜单名会是“Electron”而不是“编辑”,因为macOS上的之一个菜单总是“应用程序”菜单。要在Electron中解决这个问题,我们需要将”编辑”菜单以及后续所有菜单项都向后移动一个位置(如清单7.3和图7.4所示),以便为本章后续要实现的应用程序菜单腾出空间。
图7.3 macOS使用之一个菜单作为“应用程序”菜单,但这并不是所预期的效果。
图7.4 通过将所有菜单向后移动一个位置,“编辑”菜单就能正常显示了。很快,我们就会实现一个与原生macOS应用程序行为类似的“应用程序”菜单
代码清单7.3 :将macOS原有菜单项前移:./app/application-menu.js
const { app, BrowserWindow, Menu, shell } = require('electron');const mainProcess = require('./main');const template = < // ... Menu template from the last section. ...>;if (process.platform === 'darwin') { const name = 'Fire Sale'; template.unshift({ label: name });}module.exports = Menu.buildFromTemplate(template);
使用Electron构建应用程序的好处之一是,开发人员可以针对macOS、Windows和Linux使用同一套代码。需要注意的是,开发人员在编写代码时应该考虑每种受支持操作系统的特性。幸运的是,Node提供了process对象,该对象提供了一些能对应用程序运行环境进行自我检测的属性、 *** 和事件。
process.platform返回当前应用程序运行的平台名称,在写这篇文章的时候,process.platform支持这五个平台:darwin、freebsd、linux、sunos或win32,其中Darwin是UNIX操作系统,macOS正是基于该系统开发的。我们可以在运行时通过检测process.platform是否等于darwin来调整菜单。如果是,那么应用程序正运行在macOS上,所有菜单项应该向右移动一个位置。
为了以正确顺序显示菜单而做的一切额外工作,所得到的效果,正是图7.4所示。另外我们不需要通过“Edit”菜单来特别实现,即可获得对“听写”和“表情&符号”的支持。
7.1.2. 替换Electron默认菜单的隐性成本
Electron提供了一个默认菜单,但这是一个要么都有或要么全无的功能,当我们要替换菜单时,我们就要放弃它所有原始功能。我们不仅会丢失一些菜单项,而且还同时会丢失快捷键。比如在macOS上使用Command-X,或者在Windows和Linux上使用Control-X快捷键,从左侧窗格中剪切文本的。在macOS或Windows上分别使用Command-A或Control-A命令选择所有文本的,以及Command-Z或Control-Z命令执行撤销的,都将失效。如果你使用的是macOS,请尝试使用Command-Q退出应用程序,如果使用两次都无效,那么我们就失去了在macOS中隐藏此应用程序或其他应用程序的功能。在所有操作系统上,我们失去了“撤消”和“重做”功能、“最小化”和“关闭”窗口以及选择文本的能力,剩下的就只有复制和粘贴的功能,如图7.5所示,这是因为为我们认为的将其添加回了自定义菜单中。
图7.5 在Electron的内置菜单中实现的编辑和窗口菜单。
是否将这些功能添加回应用程序取决于开发人员,如果他们想在应用程序中省略这些功能,他们完全可以这样做。你的最初想法可能是,重新实现这些功能就像重新造轮子。幸运的是,Electron可以很容易地创建可以执行常用操作系统任务的菜单项。创建新菜单项时,可以设置一些选项。到目前为止,我们已经接触了label和type选项,你可能注意到我们这前面每个清单中的第三个菜单项的type选项都设置成了separator。
7.1.3. 实现编辑和窗口菜单
为了构建Electron菜单,我们先从实现“编辑”和“窗口”菜单开始,实现方式类似于在Electron默认菜单中定义它们一样,如图7.5所示。
代码清单7.4 :“编辑”菜单模版:./app/application-menu.js
const template = < { label: 'Edit', submenu: < { label: 'Undo', accelerator: 'CommandOrControl+Z', role: 'undo', }, { label: 'Redo', accelerator: 'Shift+CommandOrControl+Z', role: 'redo', }, { type: 'separator' }, { label: 'Cut', accelerator: 'CommandOrControl+X', role: 'cut', }, { label: 'Copy', accelerator: 'CommandOrControl+C', role: 'copy', }, { label: 'Paste', accelerator: 'CommandOrControl+V', role: 'paste', }, { label: 'Select All', accelerator: 'CommandOrControl+A', role: 'selectall', }, >, }, { label: 'Window', submenu: < { label: 'Minimize', accelerator: 'CommandOrControl+M', role: 'minimize', }, { label: 'Close', accelerator: 'CommandOrControl+W', role: 'close', }, >, },>;if (process.platform === 'darwin') { const name = app.getName(); template.unshift({ label: name });}module.exports = Menu.buildFromTemplate(template);
7.1.4. 定义菜单项的角色和快捷键
你可能已经注意到,到目前为止添加的所有菜单项都有一个特殊的role属性。这个设置很重要,因为像复制和粘贴这样的功能很难手工实现。菜单项可以具有一个role属性,它与操作系统向应用程序提供的内置功能相关联。在Windows、Linux和macOS上,菜单项的role属性可以设置为以下任意一种:
- undo
- redo
- cut
- copy
- paste
- selectall
- minimize
- close
这些角色与我们在用自己的菜单替换默认菜单时所丢失的许多功能重叠。添加具有这些角色的菜单项可以将这些功能恢复到菜单中,但是却不会恢复许多用户已经习惯的快捷键。
Electron提供了一个名为accelerator的额外属性,用于定义可以触发菜单项功能的快捷键。在创建菜单项时,可以将accelerator属性设置为符合Electron约定的字符串。清单7.5是一个添加复制功能的菜单项。
码清单7.5 :使用role和accelerator属性:./app/application-menu.js
const { app, BrowserWindow, Menu, MenuItem, shell } = require('electron');const copyMenuItem = new MenuItem({ label: 'Copy', accelerator: 'CommandOrControl+C', role: 'copy'});
在Windows和Linux上,通常在快捷键前面加上Control键。在macOS上,常使用Command键来达到类似目的。一般情况下,Command键在Linux和Windows上也是不可用的,不需要在菜单项中依赖process.platform来做条件判断,Electron提供了更方便的CommandOrControl,它在macOS上,会将快捷键绑定到Command键,在Windows和Linux上,Electron会使用Control键。另外,Electron还提供了Command、Control和CommandOrControl的简写别名,分别是Cmd、Ctrl和CmdOrCtrl。
7.1.5. macOS上还原应用程序菜单
当Electron运行时,它将模板编译成MenuItems *** ,并相应地将其设置为应用程序的菜单。还原了复制和粘贴等常用操作的快捷键,应用程序在Windows和Linux中的行为也达到了预期。然而,在macOS中,应用程序仍然缺少一些重要功能,至少缺少退出应用程序的功能。macOS中的标准应用程序菜单的结构如图7.6所示。
当运行于macOS上时,Electron提供了一组额外的角色,可以轻松还原大多数Mac应用程序的常用菜单。这些额外的角色有:
- about
- hide
- hideothers
- unhide
- front
- window
- help
- services
Electron提供的默认应用程序菜单的一些菜单项,包括应用程序的“关于”面板、macOS提供的公开服务、隐藏应用程序、隐藏其他所有应用程序以及退出应用程序,如图7.7所示。
图7.7 应用程序菜单中的菜单项使用Electron的特殊角色,可以让你在不用重新造轮子的情况下使用操作系统功能
实现应用程序菜单类似于实现“编辑”和“窗口”菜单。定义快捷方式时,Command比CommandOrControl更可取,因为该菜单只出现在macOS上。此外,我们使用模板字符串来给“关于”、“隐藏”和“退出”菜单加上应用程序名称,因为习惯上在这些菜单项中应该包含应用程序的名称。
代码清单7.6 :macOS的应用程序菜单:./app/application-menu.js
if (process.platform === 'darwin') { const name = 'Fire Sale'; template.unshift({ label: name, submenu: < { label: `About ${name}`, role: 'about', }, { type: 'separator' }, { label: 'Services', role: 'services', submenu: <>, }, { type: 'separator' }, { label: `Hide ${name}`, accelerator: 'Command+H', role: 'hide', }, { label: 'Hide Others', accelerator: 'Command+Alt+H', role: 'hideothers', }, { label: 'Show All', role: 'unhide', }, { type: 'separator' }, { label: `Quit ${name}`, accelerator: 'Command+Q', click() { app.quit(); }, }, >, });}我们的应用程序现在几乎拥有macOS上原生应用程序的所有功能,但是我们仍然需要处理一些细微的差异。在macOS上,窗口菜单有一些额外的菜单项——最明显的就是“Bring All to Front”菜单项,它可以将当前应用程序所有窗口移到最前面。此外,macOS特有的window角色还具有从“窗口”菜单中关闭和最小化当前窗口的功能,还列出了应用程序所有窗口,以及可以将它们显示在前面的功能。在不支持此角色的平台上将会忽略此角色。代码清单7.7 :合并应用程序“编辑”、“窗口”菜单:./app/application-menu.jsconst template = < { label: 'Edit', submenu: < // "Edit" menu shown in Listing 7.4 >, }, { label: 'Window', role: 'window', submenu: < // "Window" menu shown in Listing 7.4 >, },>;if (process.platform === 'darwin') { const name = app.getName(); template.unshift({ label: name, submenu: < // #Application menu shown in Listing 7.6 >, }); const windowMenu = template.find(item => item.label === 'Window'); windowMenu.role = 'window'; windowMenu.submenu.push( { type: 'separator' }, { label: 'Bring All to Front', role: 'front', } );}
图7.8 macOS中的“窗口”菜单可以让你查看应用程序当前打开的所有窗口。
7.1.8. 添加帮助菜单
无论什么平台,添加“帮助”菜单都是一个很好的选择,尤其在macOS上这样做还有一个额外的好处。即使你的应用程序还没有任何文档或技术支持提供时,内置的“帮助”菜单可以让用户搜索应用程序的菜单项,如图7.9所示。这在大多数macOS应用程序中都是有效的,对于快速检索那些嵌套很深的菜单来说非常有用。你可以随时按下Command-Shift-?组合键来访问菜单的搜索功能。
要将“帮助”菜单添加到应用程序中(如图7.10所示的结构),请添加一个具有help角色的额外菜单和一个包含该菜单项的子菜单。你必须提供一个数组作为子菜单,如清单7.8所示,即便它是空的。现在我们还可以添加激活开发者工具的功能,当然有些应用程序可能希望在发布之前删除此功能。但像Atom、Nylas Mail和Visual Studio Code这样的流行应用程序选择了保留这个功能。
图7.9 在macOS中,“帮助”菜单可以让用户搜索应用程序的菜单项。
图7.10 如清单7.8我们构建的“帮助”菜单结构。
代码清单7.8 :创建“帮助”菜单:./app/application-menu.js
const template = < // "Edit" and "Window" menus defined in Listing 7.7 { label: 'Help', role: 'help', submenu: < { label: 'Visit Website', click() { /* To be implemented */ } }, { label: 'Toggle Developer Tools', click(item, focusedWindow) { if (focusedWindow) focusedWindow.webContents.toggleDevTools(); } } >, }>;
click() *** 有三个可选参数:菜单项本身、当前处于焦点的BrowserWindow实例和事件对象。在清单7.8中,我们使用了第二个参数——当前焦点窗口——来确定哪个窗口应该切换开发者工具。
7.2. 添加应用程序的菜单功能
通过这些工作来还原我们最初可以自由获得的功能,只有当我们可以使用模板来添加自定义功能时才是值得的。用户通常希望能够从“文件”菜单中打开和保存文件,Fire Sale目前缺少这个功能。我们现在已经可以使用界面中的“Open File”按钮从文件系统中选择并打开一个Markdown文件,下一步(如图7.11所示)是通过修改“文件”菜单,添加“新建文件”、“打开文件”、“保存文件”、和“导出HTML”等菜单项以及对应的快捷键来触发相应的操作。
图7.11 本章,我们会添加一个本应用程序的“文件”菜单功能。
当用户单击“打开文件”菜单项或按下相应的快捷键时,菜单项会触发主进程中的openFile()函数,与从界面上按下按钮触发的函数相同。单击“新建文件”将调用主进程的createWindow()函数。我们先在模板中添加“文件”菜单开始,将图7.11中所示的每个功能都作为菜单项添加到模板的submenu数组中。
然而,针对保存或导出文件功能,我们分别需要Markdown窗格和HTML窗格的当前内容。如果当前有打开的文件,我们还需要该文件的名称,由于主进程无法访问该信息,因此需要我们向当前焦点窗口发送一条消息,该窗口应该为我们收集这些信息,并触发与用户单击界面按钮时相同的功能。
代码清单7.9 :自定义菜单功能:./app/application-menu.js
const template = < { label: 'File', submenu: < { label: 'New File', accelerator: 'CommandOrControl+N', click() { mainProcess.createWindow(); } }, { label: 'Open File', accelerator: 'CommandOrControl+O', click(item, focusedWindow) { mainProcess.getFileFromUser(focusedWindow); }, }, { label: 'Save File', accelerator: 'CommandOrControl+S', click(item, focusedWindow) { focusedWindow.webContents.send('save-markdown'); }, }, { label: 'Export HTML', accelerator: 'Shift+CommandOrControl+S', click(item, focusedWindow) { focusedWindow.webContents.send('save-html'); }, }, >, }, // "Edit", "Window", and "Help" menus are defined here as well.>;
向焦点窗口发送消息是成功的一半,我们仍然需要配置渲染进程来监听这些消息并进行相应地操作。我们先设置一个IPC监听器来负责接收这些消息,并在接收到消息时调用现有的保存和导出功能。
代码清单7.10 :给渲染进程添加IPC监听器:./app/renderer.js
ipcRenderer.on('save-markdown', () => { mainProcess.saveMarkdown(currentWindow, filePath, markdownView.value);});ipcRenderer.on('save-html', () => { mainProcess.saveHtml(currentWindow, filePath, markdownView.value);});
7.2.1. 处理没有焦点窗口的情况
在Windows和Linux中,当所有窗口都关闭时,应用程序就退出。在macOS上,即使所有窗口都关闭了,应用程序仍然还在运行,单击图标时会打开一个新窗口。但在某些情况下,用户可能会选择我们刚刚实现的三个菜单项中的一个,而此时的焦点窗口是undefined。在第9章,我们会介绍如何启用和禁用菜单项。现在,我们采用一种更简单的 *** :如果用户选择“打开文件”,则打开一个新窗口;如果没有内容要保存或导出的话,则显示一条错误消息。
要在用户试图保存或导出不存在的文件时显示错误消息,我们可以使用dialog.showErrorBox()函数,它类似于dialog.showMessageBox(),但是它是专门用来显示错误消息的,并且没有那么多配置选项。
代码清单7.11 :试图保存或导出不存在的文件时给出错误提示:./app/application-menu.js
const { app, dialog, Menu, MenuItem shell } = require('electron');const mainProcess = require('./main');const template = < { label: 'File', submenu: < { label: 'New File', accelerator: 'CommandOrControl+N', click() { mainProcess.createWindow(); } }, { label: 'Open File', accelerator: 'CommandOrControl+O', click(item, focusedWindow) { mainProcess.getFileFromUser(focusedWindow); }, }, { label: 'Save File', accelerator: 'CommandOrControl+S', click(item, focusedWindow) { if (!focusedWindow) { return dialog.showErrorBox( 'Cannot Save or Export', 'There is currently no active document to save or export.' ); } focusedWindow.webContents.send('save-markdown'); }, }, { label: 'Export HTML', accelerator: 'Shift+CommandOrControl+S', click(item, focusedWindow) { if (!focusedWindow) { return dialog.showErrorBox( 'Cannot Save or Export', 'There is currently no active document to save or export.' ); } focusedWindow.webContents.send('save-html'); }, }, >, },
如果用户选择的是“打开文件”,并且也没有窗口来接收该命令的话,那么问题就简单了。我们只需创建一个新窗口,等窗口显示出来就触发打开文件对话框,就像窗口一直存在一样。
代码清单7.12 :当没有窗口用于显示用户打开的新文件时就创建一个新窗口:./app/application-menu.js
const template = < { label: 'File', submenu: < { label: 'Open File', accelerator: 'CommandOrControl+O', click(item, focusedWindow) { if (focusedWindow) { return mainProcess.getFileFromUser(focusedWindow); } const newWindow = mainProcess.createWindow(); newWindow.on('show', () => { mainProcess.getFileFromUser(newWindow); }); }, }, // "Save File" and "Export HTML" menus are defined here. >, }, // "Edit", "Window", and "Help" menus are defined here.>;
首先,我们检查focusedWindow是否存在。如果有,我们希望触发之前实现的功能,并尽早从函数返回。如果没有焦点窗口,我们需要创建一个。幸运的是,在第5章中就创建了这个函数来帮助我们完成这个过程。当新窗口完成初始化后,就可以像使用现有窗口一样使用它。我们的代码现在已经可以匹配这种情况,可以继续实现其他功能。
7.3. 构建上下文菜单
在上一节,我们定义了一个菜单,并在app模块触发“ready”事件时将其设置为主进程中的应用程序菜单。应用程序一次只能有一个应用程序菜单,但是,我们可以在渲染进程中定义额外的菜单,如图7.12所示,当用户右键单击(或在某些计算机上用两个手指单击)界面的某一部位,这些菜单就会弹出。
图7.12 Electron让开发人员可以自定义DOM特定部位上的右键上下文菜单。
下一步,我们在左边markdown窗格中监听contextmenu事件。
代码清单7.13 :监听contextmenu事件:./app/renderer.js
markdownView.addEventListener('contextmenu', (event) => { event.preventDefault(); alert('One day, a context menu will go here.');});
注意,除非用户右键单击左侧窗格,否则警告不会触发。如果你想要从应用程序中的任何位置触发上下文菜单,请在window对象上而不是在DOM节点上监听。Menu模块在渲染进程中是不可用的,但是可以使用remote模块从主进程的上下文中访问它,如下面的清单所示。导入该模块,我们就可以使用Menu.buildFromTemplate()来构造一个菜单,如清单7.15所示。
代码清单7.14 :创建上下文菜单:./app/renderer.js
const { remote, ipcRenderer } = require('electron');const { Menu } = remote;const path = require('path');const mainProcess = remote.require('./main.js');const currentWindow = remote.getCurrentWindow();// Our existing renderer code…const markdownContextMenu = Menu.buildFromTemplate(< { label: 'Open File', click() { mainProcess.getFileFromUser(); } }, { type: 'separator' }, { label: 'Cut', role: 'cut' }, { label: 'Copy', role: 'copy' }, { label: 'Paste', role: 'paste' }, { label: 'Select All', role: 'selectall' },>);
要触发此菜单,要使用一个新函数来替换contextmenu事件监听器,该函数将调用新创建的菜单上的popup() *** ,如下所示。
代码清单7.15 :触发上下文菜单:./app/renderer.js
markdownView.addEventListener('contextmenu', (event) => { event.preventDefault(); markdownContextMenu.popup();});
popup() *** 有四个参数:BrowserWindow、x、y和positioningItem。所有这些参数都是可选的,如果省略了它们,那么上下文菜单将直接显示在当前浏览器窗口中鼠标光标下,这正是我们所期望的。有了这些代码,我们就可以在Markdown窗格中触发一个上下文菜单。在向应用程序添加更多功能时,我们就向上下文菜单以及其他上下文菜单添加功能即可。本章的完整代码可以在https://github.com/electron-in-action/firesale/tree/chapter-7或附录中找到。或者,你可以从https://github.com/electron-in-action/firesale.git的GitHub代码库中进行克隆,然后切到chapter-7分支,并运行npm install来看实际效果。
总结
- Electron可以让开发人员定制应用程序菜单和上下文菜单。
- Electron提供了Menu和MenuItem模块用于构建菜单。
- Menu.buildFromTemplate()函数让开发人员可以从JavaScript对象数组中构建菜单,而不必使用MenuItem构造函数。
- Electron提供了一个内置的应用程序菜单,其中充满了合理的默认设置。覆盖这个菜单意味着我们必须替换内置的功能。
- process.platform可以让开发人员检测他们应用程序当前所运行的操作系统。
- macOS的之一个菜单项是一个特殊的应用程序菜单。
- Electron为MenuItem提供了角色,可以让开发人员轻松实现常用的操作系统级别的功能。
- MenuItem有一个click() *** ,用于定义用户单击时的行为。
- MenuItem支持一个快捷方式属性,可以让开发人员定义一个快捷键来触发它的动作。
- Electron支持渲染进程中的contextmenu事件,该事件在用户右键单击DOM时触发。
《Electron实战》中文版!
标签: 菜单
模板
哪里
***
在线
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。