技法和原理:如何找到你需要的菜单项?

你一定碰到过查找某个菜单项的场景,通常我们会使用类似于 GetMenuItemInfo 这样的菜单函数,
在这类函数中,有一个参数允许你指定要查找的菜单项目的信息:MF_BYPOSITION 或者 MF_BYCOMMAND。

至此,是不是很眼熟了。今天就来给大伙儿讲讲这个。

从字面意思来理解,MF_BYPOSITION 是根据菜单的位置来进行查找,而 MF_BYCOMMAND 是根据菜单的命令 ID 来进行查找。

根据菜单的位置进行查找是很容易理解的,我们指定一个从 0 开始的数字作为菜单的位置进行菜单项的查找。换句话说,索引 0 表示第一个菜单项,依次类推。

根据菜单命令进行查找,有些小复杂,请坐稳扶好:菜单管理器将会根据你指定的菜单命令对整个菜单进行递归式查找,包含子菜单。很有可能发生的情况是,有可能在整个菜单树中会找到多个拥有同一个命令的菜单项,这个时候,函数将会从中任意选择一个出来返回给你。

例如,在层次结构中查找意味着只需传递根菜单(通常可以轻松访问)和菜单命令即可删除或禁用菜单项。
如果不搜索子菜单,那么同步菜单状态将是一件非常麻烦的事情。

但是,如果您的菜单有多个具有相同命令的项目怎么办?

好吧,简短的回答是,”那就不要用MF_BYCOMMAND了。您仍然可以使用 MF_BYPOSITION 来访问您的菜单项。”

但我对你的灵魂之问是:

为什么首先要有多个具有相同命令的菜单项呢?

当用户选择菜单时,一条 WM_COMMAND 消息将发送到窗口,并将菜单命令作为其参数之一,而其他参数均不提供菜单句柄。如果您有多个具有相同命令的菜单项,您将无法分辨用户选择了其中的哪一个,这可不是你想要的。

对于这个问题,已经有过很多讨论了,但是我想说的是,这并非 Windows 的 Bug 。

如果菜单包含多个具有相同命令的菜单项,那么 MF_BYCOMMAND 是模棱两可的,并且所承诺的只是将找到具有该命令的某些项目。它可能不是您想要的,但由于您为多个项目提供了相同的命令,因此菜单管理器已尽最大努力。

这类似于其他搜索函数,如 FindWindow 和 GetDlgItem,它们对它们找到的第一个项目进行操作。如果多个项目符合您指定的条件,则仅返回其中一个项目。

另外还有一个具体问题:查询菜单的时候,恰好没有缓存,至少现在还没有。但谁知道呢,如果我们发现许多应用程序快速连续地查询同一项目,将来可能会有一个缓存。但是这个人没有意识到的是,他们使用的未命名的自定义 GUI 库在收到 WM_INITMENUPOPUP 消息之前不会创建子菜单。在打开子菜单之前找不到该项目的原因是,在打开子菜单之前,子菜单不存在。当然,你找不到不存在的东西。

总结

优先使用按位置进行菜单项目查找,并时刻牢记:按命令查找可能会找到多个,且可能返回那个你所不需要的。

最后

Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。
本文来自:《How do the menu functions find items?》

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

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

相关文章

一定用得到的时频分析方法!广义S变换、小波变换、短时傅里叶变换(STFT)、Wigner-Ville 分布,直接运行!

适用平台:Matlab2020版本及以上 在实际应用中,时频分析通常与机器学习/深度学习技术结合,以提高故障识别的性能。时频分析可以捕捉信号在时间和频率上的瞬时变化,有助于检测到与故障相关的瞬时特征,如脉冲、振动或其它…

༺༽༾ཊ—Unity之-05-抽象工厂模式—ཏ༿༼༻

首先创建一个项目, 在这个初始界面我们需要做一些准备工作, 建基础通用文件夹, 创建一个Plane 重置后 缩放100倍 加一个颜色, 任务:使用 抽象工厂模式 创建 人物与宠物 模型, 首先资源商店下载 人物与宠物…

智能语音识别源码系统+语义理解+对话管理+语音合成 带完整的搭建教程

人工智能技术的不断发展,智能语音识别技术逐渐成为人们日常生活和工作中不可或缺的一部分。然而,目前市场上的智能语音识别产品大多存在一定的局限性,如识别率不高、功能单一等。为了解决这些问题,罗峰给大家分享一款基于智能语音…

Ps:段落面板

Ps菜单:窗口/段落 Window/Paragraph Ps菜单:文字/面板/段落面板 Type/Panels/Paragraph Panel 对于“点文本”,默认一行为一个段落。每按一次回车键,就多出一个段落。 对于“段落文本”,一段可能有多行,具体…

汽车网络安全管理体系框架与评价-汽车网络安全管理体系评价

当前 , 随若汽车联网产品渗透率、 智能传感设备搭载率的提升, 以及汽车与通信、互联网等行业的融合创新发展, 汽车行业面临愈发严峻的网络安全风险, 对消费者人身财产安全、 社会安全乃至国家安全产生威胁, 是产业发展…

多智能体强化学习--MAPPO(pytorch代码详解)

标题 代码详解Actor和Critic网络的设置 代码详解 代码链接(点击跳转) Actor和Critic网络的设置 基本设置:3个智能体、每个智能体观测空间18维。Actor网络:实例化一个actor对象,input-size是18Critic网络&#xff1…

产品解读 | 新一代湖仓集存储,多模型统一架构,高效挖掘数据价值

星环科技TDH一直致力于给用户带来高性能、高可靠的一站式大数据基础平台,满足对海量数据的存储和复杂业务的处理需求。 同时在易用性方面持续深耕,降低用户开发和运维成本,让数据处理平民化,助力用户以更便捷、高效的方式去挖掘数…

Python tkinter (9) ——Menu控件

本文主要是Python tkinter Menu菜单控件介绍及使用示例。 tkinter系列文章 python tkinter窗口简单实现 Python tkinter (1) —— Label标签 Python tkinter (2) —— Button标签 Python tkinter (3) —— Entry标签 Python tkinter (4) —— Text控件 Python tkinter (5…

计算机毕业设计 基于SpringBoot的校园闲置物品交易系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…

多场景建模:腾讯3MN

3MN: Three Meta Networks for Multi-Scenario and Multi-Task Learning in Online Advertising Recommender Systems 背景 推荐领域的多场景多任务学习:维护单模型即可节省资源也可节省人力;各个场景的数据共享,理论上面学习是更加充分的 …

微信小程序Skyline在手机端不渲染的问题之一及其解决方式

问题:电脑端是skyline渲染,手机端是webview渲染?如何解? 开发者工具 当前渲染模式:Skyline 当进行预览时手机端却是: 请注意看轮播图的显示情况 请注意看轮播图的显示情况 请注意看轮播图的显示情况 从轮播图上来看,手机端是webview渲染…

“有国才有家”这个观点应该怎么理解?

​《有国才有家》这首歌由马仕健作词作曲,蒋国佳编曲,刘畅混音,马仕健演唱。 “家是最小国,国是千万家”。千百年来,“家国”这两个词一直紧紧联系在一起。“国家好,民族好,大家才会好”&#x…

【嵌入式学习】C++QT-Day3-C++基础

笔记 见我的博客:https://lingjun.life/wiki/EmbeddedNote/19Cpp 作业 设计一个Per类,类中包含私有成员:姓名、年龄、指针成员身高、体重,再设计一个Stu类,类中包含私有成员:成绩、Per类对象p1,设计这两个类的构造函…

Linux文件管理(下)

上上篇介绍了Linux文件管理的上部分内容,这次继续将 Linux文件管理的剩余部分说完。内容如下。 一、查看文件内容 1、cat 命令 1.1 输出文件内容 基本语法: cat 文件名称主要功能:正序输出文件的内容。 eg:输出 readme.txt文…

对Spring当中AOP的理解

AOP(面向切面编程)全称Aspect Oriented Programminge AOP就是把系统中重复的代码抽取出来,单独开发,在系统需要时,使用动态代理技术,在不修改源码的基础上,将单独开发的功能通知织入(应用)到系统中的过程,完…

慎投!这3本期刊诚信风险高,被警告和风险低的期刊选哪个?

近年来,学术界对学术诚信的关注越来越多,期刊的学术诚信风险也日益受到关注。科睿唯安在今年三月份剔除的35本SCI期刊中,绝大多数涉及学术诚信问题!据官方介绍,其已正式开发了一款AI工具,可以锁定存在学术诚…

【JavaScript 基础入门】01 编程语言和计算机基础

编程语言和计算机基础 目录 编程语言和计算机基础1 - 编程语言1.1 编程1.2 计算机语言1.3 编程语言1.4 翻译器1.5 编程语言和标记语言区别1.6 总结 2 - 计算机基础2.1 计算机组成2.2 数据存储2.3 数据存储单位2.4 程序运行 1 - 编程语言 1.1 编程 编程: 就是让计算…

微信小程序(二十二)获取全局实例

注释很详细,直接上代码 上一篇 新增内容: 1.全局实例的定义位置 2.全局实例中数据的修改方法 源码: app.js App({//数据可以包括在第二级globalData:{userInfo:null,token:1243,userInfo:null},//globalData并不是关键词,数据可以…

预制菜春节大洗牌,味知香、千味央厨谁是“硬菜”?

2024年春节预制菜销量走俏,预制菜依然是消费者“年夜饭”上的重头戏。各大生鲜平台、电商、商超、餐饮门店都纷纷开卖春节预制菜。 预制菜赛道两大“玩家”:“预制菜第一股”味知香(605089.SH)、“餐饮供应链第一股”千味央厨(001215.SZ)均在…

jrt运维命令改造

以前发布网站都是定死网站放置路径的,现在JRT想面向更广范围推广,所以就不能明确确定网站放置目录,为此需要改造一下jrt命令和sh来满足目录不确定情况和多个程序用不同管理命令的要求。 以前是写死的,现在改为调程序运行目录的sh…