Windows菜单
目录
第1章 Windows菜单
1.1 窗口菜单和弹出菜单
Windows菜单分为两类:窗口菜单和弹出菜单。窗口菜单主要用来放在某个窗口上。弹出菜单有两个作用,一是鼠标右键单击时显示的菜单;二是作为子菜单添加到窗口菜单。
打开"记事本"程序,右键菜单就是一个弹出菜单:
图1.1 弹出菜单
"记事本"程序的菜单栏部分就是一个窗口菜单,它又包含了"文件""编辑"……这些弹出菜单。
图1.2 窗口菜单
窗口菜单由CreateMenu创建,使用SetMenu将其设置到某个窗口,使用DestroyMenu销毁。
弹出菜单由CreatePopupMenu创建,使用AppendMenu或InsertMenuItem将其添加到窗口菜单或上一级弹出菜单,也可以使用TrackPopupMenu显示弹出菜单。弹出菜单的销毁同样是调用DestroyMenu函数。
1.2 使用SetMenu
下面以代码的方式创建图1.2所示的窗口菜单:
//创建窗口菜单
HMENU hMenuWnd = ::CreateMenu();
{//创建"文件"弹出菜单,并将其添加到窗口菜单
//创建"文件"菜单,这是一个弹出菜单
HMENU hMenuFile = ::CreatePopupMenu();
//给"文件"菜单添加"新建"菜单项,0x8000是菜单项ID号
::AppendMenu(hMenuFile,MF_STRING,0x8000,_T("新建"));
//给"文件"菜单添加"打开"菜单项
::AppendMenu(hMenuFile,MF_STRING,0x8001,_T("打开"));
//给"文件"菜单添加一条分隔线
::AppendMenu(hMenuFile,MF_SEPARATOR,0,NULL);
//继续给"文件"菜单添加菜单项
... ... ... ...
//将整个"文件"菜单添加到窗口菜单
::AppendMenu(hMenuWnd,MF_POPUP,(UINT)hMenuFile,_T("文件"));
}
{//创建"编辑"弹出菜单,并将其添加到窗口菜单
//创建"编辑"菜单,这是一个弹出菜单
HMENU hMenuEdit = ::CreatePopupMenu();
//给"编辑"菜单添加菜单项
... ... ... ...
//将整个"编辑"菜单添加到窗口菜单
::AppendMenu(hMenuWnd,MF_POPUP,(UINT)hMenuEdit,_T("编辑"));
}
{//创建"格式"弹出菜单,并将其添加到窗口菜单
... ... ... ...
}
{//创建"查看"弹出菜单,并将其添加到窗口菜单
... ... ... ...
}
{//创建"帮助"弹出菜单,并将其添加到窗口菜单
... ... ... ...
}
//将窗口菜单设置到窗口上
::SetMenu(hWnd,hMenuWnd);
代码说明:
1、SetMenu的第二个参数必须是窗口菜单句柄,即这个句柄必须由CreateMenu函数创建,而不能是CreatePopupMenu创建的弹出菜单句柄。
2、::AppendMenu(hMenuWnd,MF_POPUP,(UINT)hMenuFile,_T("文件"));将弹出菜单hMenuFile添加到窗口菜单hMenuWnd。它只是把hMenuFile这个句柄添加到hMenuWnd所维护的数据结构里,即它添加的只是弹出菜单的一个引用,并不是把弹出菜单的所有菜单项添加到窗口菜单。因此,可以先将hMenuFile添加到hMenuWnd,再给hMenuFile添加菜单项,如下面的代码所示:
{//创建"文件"弹出菜单,并将其添加到窗口菜单
//创建"文件"菜单,这是一个弹出菜单
HMENU hMenuFile = ::CreatePopupMenu();
//将整个"文件"菜单添加到窗口菜单
::AppendMenu(hMenuWnd,MF_POPUP,(UINT)hMenuFile,_T("文件"));
//给"文件"菜单添加"新建"菜单项,0x8000是菜单项ID号
::AppendMenu(hMenuFile,MF_STRING,0x8000,_T("新建"));
... ... ... ...
}
3、DestroyMenu(hMenuWnd)将销毁它的子菜单、孙菜单。也就是说执行DestroyMenu(hMenuWnd)之后,hMenuFile、hMenuEdit……也被销毁了。上面的代码里,在::SetMenu(hWnd,hMenuWnd);之前增加如下测试代码:
DestroyMenu(hMenuWnd);
hMenuWnd = ::CreateMenu();
::AppendMenu(hMenuWnd,MF_POPUP,(UINT)hMenuFile,_T("文件"));
DestroyMenu(hMenuWnd);将销毁hMenuWnd和hMenuFile,所以AppendMenu将会增加无效的hMenuFile给hMenuWnd。可以想象,"文件"菜单里是不会有菜单项的。
4、何时调用DestroyMenu(hMenuWnd)销毁窗口菜单呢?应该是不再使用时销毁,具体的就是在处理窗口的WM_DESTROY消息时销毁,或者在SetMenu更换菜单后销毁。
1.3 使用TrackPopupMenu
上一节的代码里包含了弹出菜单的创建,并增加到窗口菜单。弹出菜单还有一个作用就是用来显示图1.1所示的右键弹出菜单,方法就是调用TrackPopupMenu函数。需要注意的是:TrackPopupMenu的第一个参数必须是一个弹出菜单的句柄,就是说它必须由CreatePopupMenu创建。
以上一节的代码为例:
//可以显示出弹出菜单
TrackPopupMenu(hMenuFile,...);
//无法显示弹出菜单,因为hMenuWnd是一个窗口菜单,不是弹出菜单
TrackPopupMenu(hMenuWnd,...);
//GetSubMenu(hMenuWnd,0) 返回的其实就是hMenuFile
//因此下面的代码可以正常显示弹出菜单
TrackPopupMenu(GetSubMenu(hMenuWnd,0),...);
当使用LoadMenu从资源里载入菜单时,其返回的是一个窗口菜单句柄,直接传递给TrackPopupMenu是无法正常显示的。必须使用GetSubMenu获得窗口菜单里的弹出菜单句柄,才能正常调用TrackPopupMenu。
执行TrackPopupMenu之后,可以立即调用DestroyMenu销毁菜单。
Windows菜单的更多相关文章
- eclipse安装ADT后在windows菜单下找不到android SDK and AVD Manager
eclipse安装ADT后在windows菜单下找不到android SDK and AVD Manager选项的解决办法 - zhjr1220的专栏 - 博客频道 - CSDN.NET http: ...
- ADT后windows菜单未找到Android SDK Manager和Android Virtual Device Manager该解决方案的选择
打开今天凌晨ADT准备编译androidproject的时候,突然发现windows菜单下的Android SDK Manager和Android Virtual Device Manager选项不见 ...
- eclipse安装ADT后在windows菜单下找不到android SDK and AVD Manager选项的解决办法
在eclipse中点击window→Customize Perspective→Command Groups availability→Available command groups下勾选Andro ...
- WIN 下的超动态菜单(三)代码
WIN 下的超动态菜单(一)简介 WIN 下的超动态菜单(二)用法 WIN 下的超动态菜单(三)代码 作者:黄山松,发表于博客园:http://www.cnblogs.com/tomview/ 超动态 ...
- WIN 下的超动态菜单(二)用法
WIN 下的超动态菜单(一)简介 WIN 下的超动态菜单(二)用法 WIN 下的超动态菜单(三)代码 作者:黄山松,发表于博客园:http://www.cnblogs.com/tomview/ ...
- 深入体验bash on windows,在windows上搭建原生的linux开发环境,酷!
今年微软Build 2016大会最让开发人员兴奋的消息之一,就是在Windows上可以原生运行Linux bash,对开发人员来说,这是一个喜闻乐见的消息. 1 安装 你必须安装开发者预览版本,才能使 ...
- 重新安装配置ubuntu的引导菜单
查看分区挂在情况,找到ubuntu所在分区(boot)$sudo fdisk -l 卸载isodevice镜像设备所在盘分区(boot) $sudo umount -l /isodev ...
- Playmaker Input篇教程之PlayMaker菜单概述
Playmaker Input篇教程之PlayMaker菜单概述 Playmaker InputPlayMaker菜单概述 Playmaker插件被导入游戏项目以后,会自动为Unity编辑器添加一个名 ...
- Windows API 的数据类型与 Delphi 数据类型对照表
Windows 数据类型 Delphi 数据类型 描述 LPSTR PAnsiChar 字符串指针 LPCSTR PAnsiChar 字符串指针 DWORD LongWord 整数 BOOL Long ...
随机推荐
- Mysql-学习笔记(==》集合函数与分组四)
-- 聚集函数 配合分组语句 group by-- 显示最高分SELECT MAX(sscore) FROM db.`student`;-- 显示最高分学生的信息min maxSELECT * FRO ...
- (5)Redis几个认识误区
前几天微博发生了一起大的系统故障,很多技术的朋友都比较关心,其中的原因不会超出James Hamilton在On Designing and Deploying Internet-Scale Serv ...
- ListableBeanFactory
ListableBeanFactory public interface ListableBeanFactory extends BeanFactory 该接口中定义了可以获取配置中所有bean的信息 ...
- 在vs中怎样一次性的添加一个文件夹到解决方案里
这个方法通常用到编译源码库方面,在这里我以编译静态库为例: 1.首先建立自己的工程Mytest 第二步 选择静态库 点击finish 完成工程的建立 第三步 点击PROJECT菜单项 选中Show A ...
- SqlSever基础 datepart函数 返回现在多少秒
镇场诗:---大梦谁觉,水月中建博客.百千磨难,才知世事无常.---今持佛语,技术无量愿学.愿尽所学,铸一良心博客.------------------------------------------ ...
- SQL 2008下载地址以及全新安装详细过程
本博文将详细介绍如何安装SQL 2008以及在这个安装过程中每个选项的意思,如何选择使用什么和不使用什么等等琐碎的东东. 下面——开始了!!!SHOW TIME~~~先提供各种程序下载地址:SQL 2 ...
- [SAP ABAP开发技术总结]选择屏幕——PARAMETERS
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- SQL疑难杂症【3】链接服务器提示"无法启动分布式事物"
今天接到用户反馈,应用系统出现异常,无法正常使用,于是用Profiler跟踪了一下语句,发现执行的存储过程中调用了链接服务器,做了一些跨服务器操作数据的动作,刚好就是这个链接服务器出错了,错误截图如下 ...
- C# DataGridView控件绑定数据后清空数据
//1.this.dataGridView1.DataSource = null;//会将DataGridView的列也删掉 //2.this.dataGridView1.Columns.Clear( ...
- bootstrap学习笔记<八>(bootstrap核心布局风格——栅格系统)
栅格系统(bootstrap的核心之一,也是bootstrap的主要布局风格) 栅格系统是对原有div布局的升级版.打破了传统div模式只能纵向垂直排列的弊端,大大提高了页面布局的速度和效果,也很好的 ...