Windows菜单

目录

第1章 Windows菜单    1

1.1 窗口菜单和弹出菜单    1

1.2 使用SetMenu    2

1.3 使用TrackPopupMenu    4

第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销毁菜单。

时间: 2024-07-28 13:56:10

Windows菜单的相关文章

eclipse安装ADT后在windows菜单下找不到android SDK and AVD Manager

eclipse安装ADT后在windows菜单下找不到android SDK and AVD Manager选项的解决办法 - zhjr1220的专栏 - 博客频道 - CSDN.NET  http://blog.csdn.net/zhjr1220/article/details/9569113 在eclipse中点击window→Customize Perspective→Command Groups availability→Available command groups下勾选Androi

ADT后在windows菜单下找不到Android SDK Manager和Android Virtual Device Manager选项的解决办法

今天一大早打开ADT准备编译android工程的时候,突然发现windows菜单下的Android SDK Manager和Android Virtual Device Manager选项不见了.因为我昨天把一个android工程转换为了C/C++工程,就莫名其妙出了这个问题.           在网上搜了一下,找到了解决方案: 在ADT中点击window→Customize Perspective→Command Groups availability→Available command g

eclipse安装ADT后在windows菜单下找不到android SDK and AVD Manager选项的解决办法

在eclipse中点击window→Customize Perspective→Command Groups availability→Available command groups下勾选Android SDK and AVD Manager选项,然后在Tool Bar Visibility 下勾选Android SDK and AVD Manager选项

重装windows后ubuntu系统启动菜单不见的修复方法

当我们原来系统中有ubuntu的时候,如果我们重装或安装新的windows系统时,会发现ubuntu系统启动菜单不见啦,我们重现安装ubuntu系统也可以解决这个问题,但是我们以前在ubuntu系统做的努力都白费啦,这里我介绍一下使用ubuntu系统盘来恢复我们的ubuntu系统启动菜单. 用光盘启动电脑,选择"试用Ubuntu",进入LiveCD. 1 使用LiveCD启动电脑 2 打开终端 3 查看ubuntu所在分区(sudo fdisk -l)如图1所示/dev/sda1所示为

Windows API 的数据类型与 Delphi 数据类型对照表

Windows 数据类型 Delphi 数据类型 描述 LPSTR PAnsiChar 字符串指针 LPCSTR PAnsiChar 字符串指针 DWORD LongWord 整数 BOOL LongBool 布尔型 PBOOL ^BOOL 指向布尔值的指针 PByte ^Byte 指向字节值的指针 PINT ^Integer 指向整数值的指针 PSingle ^Single 指向单精度浮点值的指针 PWORD ^Word 指向16位值的指针 PDWORD ^DWORD 指向32位值的指针 LP

Windows 10上快速尝鲜bash on Ubuntu

今年微软Build 2016大会最让开发人员兴奋的消息之一,就是在Windows上可以原生运行Linux bash,对于非开发人员来讲,可能不知道这意味着什么,而对于开发人员来说,意味着Windows弥补了相比于MAC OS的终端的短板,你可以运行你熟悉的Linux bash,python,perl,使用一些Linux下的library……而不需要再安装一个Cygwin或者,安装一个虚拟机来跑Linux了. 具体新闻请参考: http://www.cnbeta.com/articles/4880

重新安装配置ubuntu的引导菜单

 查看分区挂在情况,找到ubuntu所在分区(boot)$sudo fdisk   -l   卸载isodevice镜像设备所在盘分区(boot) $sudo  umount  -l  /isodevice   挂载ubuntu所在分区(boot)到mnt (这里的/dev/sda还是sdb...根据你安装的ubuntu所在硬盘...或者硬盘类型不同也会是其他标示) $ sudo  mount  -l  /dev/sdax/  /mnt   安装grub (/dev/sda是第一块硬盘,如果你安

WIN 下的超动态菜单(二)用法

WIN 下的超动态菜单(一)简介 作者:黄山松,发表于博客园:http://www.cnblogs.com/tomview/         auto_dynamenu 是一个动态生成WINDOWS菜单的c++封装库,设计思路是要尽量简化动态菜单的生成代码,在程序界面任何地方想要显示菜单(特别是右键菜单)的时候,可以方便生成菜单,特别可以根据程序当时的内部数据,内部状态来生成不同的动态菜单.         auto_dynamenu 只封装了一个静态的接口函数,这样处理的目的是把类的实现代码可

bash on windows

bash on windows 今年微软Build 2016大会最让开发人员兴奋的消息之一,就是在Windows上可以原生运行Linux bash,对开发人员来说,这是一个喜闻乐见的消息. 1 安装 你必须安装开发者预览版本,才能使用windows的linux subsystem功能. 首先打开你的Windows 10的设置,在"更新和安全"选项中(我的机器是英文操作系统,但中文操作系统类似),选择"开发者",然后选择"开发者模式": 在Wind