目录

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

Windows菜单的更多相关文章

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

    eclipse安装ADT后在windows菜单下找不到android SDK and AVD Manager选项的解决办法 - zhjr1220的专栏 - 博客频道 - CSDN.NET  http: ...

  2. ADT后windows菜单未找到Android SDK Manager和Android Virtual Device Manager该解决方案的选择

    打开今天凌晨ADT准备编译androidproject的时候,突然发现windows菜单下的Android SDK Manager和Android Virtual Device Manager选项不见 ...

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

    在eclipse中点击window→Customize Perspective→Command Groups availability→Available command groups下勾选Andro ...

  4. WIN 下的超动态菜单(三)代码

    WIN 下的超动态菜单(一)简介 WIN 下的超动态菜单(二)用法 WIN 下的超动态菜单(三)代码 作者:黄山松,发表于博客园:http://www.cnblogs.com/tomview/ 超动态 ...

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

    WIN 下的超动态菜单(一)简介 WIN 下的超动态菜单(二)用法 WIN 下的超动态菜单(三)代码 作者:黄山松,发表于博客园:http://www.cnblogs.com/tomview/     ...

  6. 深入体验bash on windows,在windows上搭建原生的linux开发环境,酷!

    今年微软Build 2016大会最让开发人员兴奋的消息之一,就是在Windows上可以原生运行Linux bash,对开发人员来说,这是一个喜闻乐见的消息. 1 安装 你必须安装开发者预览版本,才能使 ...

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

     查看分区挂在情况,找到ubuntu所在分区(boot)$sudo fdisk   -l   卸载isodevice镜像设备所在盘分区(boot) $sudo  umount  -l  /isodev ...

  8. Playmaker Input篇教程之PlayMaker菜单概述

    Playmaker Input篇教程之PlayMaker菜单概述 Playmaker InputPlayMaker菜单概述 Playmaker插件被导入游戏项目以后,会自动为Unity编辑器添加一个名 ...

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

    Windows 数据类型 Delphi 数据类型 描述 LPSTR PAnsiChar 字符串指针 LPCSTR PAnsiChar 字符串指针 DWORD LongWord 整数 BOOL Long ...

随机推荐

  1. Jenkins构建Git manager服务器的源码

    1,下载scm manager 源码库管理,下载后解压即可: 2,运行bin目录下的scm-server.bat文件,启动服务: 3,建议将scm-server放在git客户端的安装目录下,方便管理 ...

  2. Linux 运维工程师的十个基本技能点

    本人是linux运维工程师,对这方面有点心得,现在我说说要掌握哪方面的工具吧. 说到工具,在行外可以说是技能,在行内我们一般称为工具,就是运维必须要掌握的工具.我就大概列出这几方面,这样入门就基本没问 ...

  3. BZOJ 1835 基站选址(线段树优化DP)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1835 题意:有N个村庄坐落在一条直线上,第 i(i>1)个村庄距离第1个村庄的距离 ...

  4. Myeclipse 10.7 android(安卓) 开发环境搭建

    1 下载并安装JDK,并且设置环境变量 2 下载安装 installer_r24.3.4-windows.exe (Android SDK Manager) 3 使用 Android SDK Mana ...

  5. 常用CMD命令

    查看电脑最大支持多大的内存:    wmic memphysical get maxcapacity   查询DNS:    nslookup a.root-servers.net   路由线路:  ...

  6. Codeforces Round #257 (Div. 2) A题

    A. Jzzhu and Children time limit per test 1 second memory limit per test 256 megabytes input standar ...

  7. U盘制作Ubuntu15.04启动盘失败

    先用ubuntu15.04光盘在已有xp的电脑上安装成功​ 随后在Ubuntu安装labview说glibc没安装​ 但是ldd --version显示是安装的新版的​ 后来怀疑是86_64的原因​ ...

  8. x名称空间

    XAML代码的WPF程序都需要通过语句:xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml",x就是用来映射xmlns:x= ...

  9. Scrum Meeting---Three(2015-10-27)

    今日已完成任务和明日要做的任务 姓名 今日已完成任务 今日时间 明日计划完成任务 估计用时 董元财 今日我学习了Java Web,同时安装好了我的MySQL 4h 进行数据库设计以及Web项目的创建 ...

  10. poj1971Parallelogram Counting

    链接 越来越感觉到了数学的重要性!.. 这题本来用以斜率和长度为key值进行hash不过感觉很麻烦还TLE了.. 最后知道中点一样的话就可以组成平行四边形,初中数学就可以了.. #include &l ...