菜单可能是Windows提供的统一用户界面中最重要的一种方式,菜单通常在标题栏的下一行显示,这一栏叫做菜单栏,菜单栏中的每一项称之为菜单项,菜单栏中的每一个菜单项在激活时会显现一个下拉菜单(也可以说是它的子菜单),下拉菜单中也可以有多个菜单项,每个菜单项又可以有子菜单,每个菜单项都有一个唯一的数字标示,称为菜单项的ID,但是有子菜单的菜单项没有ID。用户点击某项后,会产生一个WM_COMMAND消息发送到其父窗口,该消息中包含了这个菜单项的ID。菜单的创建可以通过可视化的方法创建,也可以通过编写资源脚本的方式创建菜单资源,在这里重点说明如何通过脚本编写的方式创建菜单

//Menu
IDM_MENU MENU 
BEGIN
    POPUP "文件(&F)"
    BEGIN
        MENUITEM "打开(&O)",                      IDM_OPEN
        MENUITEM "关闭(&C)",                      IDM_OPTION
        MENUITEM SEPARATOR
        MENUITEM "关闭(&X)",                      IDM_EXIT
    END
    POPUP "查看(&V)"
    BEGIN
        MENUITEM "字体(&V)...\tAlt + F",          IDM_SETFONT
        MENUITEM "背景色(&B)...\tCtrl + Alt + B",  40009
        MENUITEM SEPARATOR
        MENUITEM "被禁用的菜单项",                     ID_40010, INACTIVE
        MENUITEM "变绘的菜单项",                      ID_40011, GRAYED
        MENUITEM "大图标(&G)",                     40012
        MENUITEM "小图标(&M)",                     IDM_SMALL
        MENUITEM "列表(&L)",                      40015
        MENUITEM SEPARATOR
        MENUITEM "详细信息(&D)",                    IDM_DETAIL
        POPUP "工具栏"
        BEGIN
            MENUITEM "标准按钮(&S)",                    40019
            MENUITEM "文字标签(&C)",                    40020
            MENUITEM "命令栏(&I)",                     40021
        END
        MENUITEM "状态栏(&U)",                     40022
    END
    POPUP "帮助(&H)", HELP
    BEGIN
        MENUITEM "帮助主题(&H)\tF1",                IDM_HELP
        MENUITEM "关于本程序(&A)...",                40025
    END
END
<pre name="code" class="cpp">//ACCELERATORS

IDA_MAIN ACCELERATORS 
BEGIN
    VK_F1,          IDM_HELP,               VIRTKEY, NOINVERT
    "B",            IDM_SETCOLOR,           VIRTKEY, CONTROL, ALT, NOINVERT
    "F",            IDM_SETFONT,            VIRTKEY, ALT, NOINVERT
END

下面来分析这段代码:

首先是通过一些列的宏定义来定义各种菜单项的ID,菜单ID用于唯一标识一个菜单项,不同的菜单项所用的ID号应该不同除非这些菜单项完成相同的工作,菜单项的ID可以是16位的整数,同时菜单项也可以用字符串来表示,在调用相应的API函数的时候检测到这个值大于10000h的时候将它作为字符串指针,这个时候用字符串唯一标示菜单项,当这个数小于10000h时表示的是一个数字,这个时候用数字唯一标示。

菜单在脚本中的定义格式为:

菜单ID MENU [DISCARDABLE]

BEGIN

菜单项的定义

END

菜单ID:每个菜单都有的一个唯一的标示,可以是字符串,可以是数字。

DISCARDABLE:菜单的内存属性,标示菜单在不再使用的时候可以暂时从内存中释放以节省内存

菜单项的定义方法有3种分别对应不同类型的菜单项:

MENUITEM 菜单文字,命令ID, [选项列表](用法1)

MENUITEM SEPARATOR                                 (用法2)

popup 菜单文字 [,选项]

BEGIN

MENUITEM 菜单文字,命令ID, [选项列表]

.........................

END                                                                        (用法3)

用法1:用于创建一个菜单项;

用法2:用于创建一个分割符;

用法3:用于创建一个菜单项的子菜单项;

菜单文字:显示在菜单项上的文字,需要字符串中某个字母带下划线的话,可以在字母前面加上一个&符号,比如上面的“状态栏(&U)”,带下划线的字母被系统当做快捷键,比如我们点击查看菜单项,打开它的子菜单,在按下字母U就相当于直接点击菜单中的状态栏一项;

命令ID:上述我们定义的菜单ID项,父窗口的WM_COMMAND消息的参数中带有这个值,通过这个值判断是哪个菜单项被点击;

选项列表:用来定义菜单项的各种属性,他可以是下面的值:

CHECKED——表示打上选定标志(菜单项前有一个钩)

GRAYED——菜单项变灰

INAVTIVE——菜单项不可用

MENUBREAK或者MENUBARBREAK——表示这个菜单项和以后的菜单项在新的一列显示;

对于popup后面的选项可以是下面值的一个:

GRAYED——菜单项变灰

INAVTIVE——菜单项不可用

HELP——菜单项靠右边显示

快捷键的定义格式为:快捷键ID ACCELERATORS

BEGIN

键名, 命令 [, 类型] [,选项]

END

键名:表示加速键对应的按键,可以有3中方式定义:

“^字母” :表示Ctrl加上字母

”字母“:表示字母,这时类型必须指明为VIRTKEY

数值:表示ASCii码为该数值的字母,这个时候类型必须指明为ASCii

命令ID:按下加速键以后Windows向程序发送的命令ID,如果想把加速键和菜单项关联起来,这里就是相应的菜单项的ID

类型:用以指定键的定义方式,可以是ASCii或者VIRTKEY

选项:可以是Alt、control、shift中的一个或多个,表示这些键和键名定义的键一起组成一个快捷键

菜单项的消息响应:

菜单项的处理一般由菜单父窗口处理,菜单被选中中时会向其父窗口发送一条WM_COMMAND的消息,将该项的相关信息告诉给其父窗口,该消息的说明如下:

WM_COMMAND
wNotifyCode = HIWORD(wParam); // 通知码 若对应的资源为加速键该值为1,若为菜单项则为0
wID = LOWORD(wParam); // 菜单项、加速键、控件的ID
hwndCtl = (HWND) lParam; // 控件句柄

我们可以在WM_COMMAND消息的处理中添加如下的内容,让其显示我们选中的是那一项:

if (IDM_HELP == LOWORD(wParam))
{
MessageBox(hWnd, "您选中了帮助主题菜单项","提示", MB_OK);
}

当选择“帮助主题”的时候,会弹出一个消息框,如果按下F1键也会显示这样一个消息框,因为我们已经将加速键绑定到对应的菜单项上面。

Windows程序设计学习笔记(五)——菜单资源和加速键的使用的更多相关文章

  1. Windows程序设计学习笔记(1):一个简单的windows程序

    <Windows程序设计>(第五版)(美Charles Petzold著) #include<windows.h> LRESULT CALLBACK WndProc(HWND, ...

  2. Windows程序设计学习笔记(一)Windows内存管理初步

    学习Windows程序设计也有一些时间了,为了记录自己的学习成果,以便以后查看,我希望自己能够坚持写下一系列的学习心得,对自己学习的内容进行总结,同时与大家交流.因为刚学习所以可能有的地方写不不正确, ...

  3. Windows程序设计学习笔记(四)自绘控件与贴图的实现

    Windows系统提供大量的控件供我们使用,但是系统提供的控件样式都是统一的,不管什么东西看久了自然会厌烦,为了使界面更加美观,添加一些新的东西我们需要自己绘制控件. 控件在默认情况下并不进行自绘,如 ...

  4. windows程序设计学习笔记(一)

    windows里的变量类型 1.简单重定义windows变量 BOOL (TRUE FALSE) INT UINT(32位,4字节) LONG DWORD(32位,4字节) lParam,wParam ...

  5. 20145213《Java程序设计学习笔记》第六周学习总结

    20145213<Java程序设计学习笔记>第六周学习总结 说在前面的话 上篇博客中娄老师指出我因为数据结构基础薄弱,才导致对第九章内容浅尝遏止地认知.在这里我还要自我批评一下,其实我事后 ...

  6. (转)Qt Model/View 学习笔记 (五)——View 类

    Qt Model/View 学习笔记 (五) View 类 概念 在model/view架构中,view从model中获得数据项然后显示给用户.数据显示的方式不必与model提供的表示方式相同,可以与 ...

  7. python3.4学习笔记(五) IDLE显示行号问题,插件安装和其他开发工具介绍

    python3.4学习笔记(五) IDLE显示行号问题,插件安装和其他开发工具介绍 IDLE默认不能显示行号,使用ALT+G 跳到对应行号,在右下角有显示光标所在行.列.pycharm免费社区版.Su ...

  8. 【opencv学习笔记五】一个简单程序:图像读取与显示

    今天我们来学习一个最简单的程序,即从文件读取图像并且创建窗口显示该图像. 目录 [imread]图像读取 [namedWindow]创建window窗口 [imshow]图像显示 [imwrite]图 ...

  9. C#可扩展编程之MEF学习笔记(五):MEF高级进阶

    好久没有写博客了,今天抽空继续写MEF系列的文章.有园友提出这种系列的文章要做个目录,看起来方便,所以就抽空做了一个,放到每篇文章的最后. 前面四篇讲了MEF的基础知识,学完了前四篇,MEF中比较常用 ...

随机推荐

  1. 机器学习——深度学习(Deep Learning)

    Deep Learning是机器学习中一个非常接近AI的领域,其动机在于建立.模拟人脑进行分析学习的神经网络,近期研究了机器学习中一些深度学习的相关知识,本文给出一些非常实用的资料和心得. Key W ...

  2. Python绘制3d螺旋曲线图实例代码

    Axes3D.plot(xs, ys, *args, **kwargs) 绘制2D或3D数据 参数 描述 xs, ys X轴,Y轴坐标定点 zs Z值,每一个点的值都是1 zdir 绘制2D集合时使用 ...

  3. 十六、Spring Boot 部署与服务配置

    spring Boot 其默认是集成web容器的,启动方式由像普通Java程序一样,main函数入口启动.其内置Tomcat容器或Jetty容器,具体由配置来决定(默认Tomcat).当然你也可以将项 ...

  4. mybatis转义符(转)

    第一种方法: 用了转义字符把>和<替换掉,然后就没有问题了. SELECT * FROM test WHERE 1 = 1 AND start_date  <= CURRENT_DA ...

  5. sql语句百万数据量优化方案

    一:理解sql执行顺序 在sql中,第一个被执行的是from语句,每一个步骤都会产生一个虚拟表,该表供下一个步骤查询时调用,比如语句:select top 10 column1,colum2,max( ...

  6. 让PIP源使用国内镜像,提升下载速度和安装成功率。

      对于Python开发用户来讲,PIP安装软件包是家常便饭.但国外的源下载速度实在太慢,浪费时间.而且经常出现下载后安装出错问题.所以把PIP安装源替换成国内镜像,可以大幅提升下载速度,还可以提高安 ...

  7. Exception in thread "main" java.lang.NoClassDefFoundError: org/springframework/boot/context/embedded/ServletRegistrationBean

    异常信息 2017-09-02 18:06:37.223 [main] ERROR o.s.boot.SpringApplication - Application startup failed ja ...

  8. ligerUI---ligerForm中下拉框使用

    写在前面: 最近项目的前框框架用的是ligerUI,一开始我是拒绝的,因为貌似ligerUI很少有人用,我真的很想问我们team的斌哥哥为什么要用ligerUI来做前端框架?????(啊哈哈哈,用什么 ...

  9. JAVA中的设计模式二(工厂模式)

    工厂模式:主要用来实例化有共同接口的类,工厂模式可以动态决定应该实例化那一个类. 工厂模式主要有: 简单工厂模式,工厂方法,抽象工厂: 简单工厂: 又叫静态工厂,是工厂模式三中状态中结构最为简单的.主 ...

  10. Java多线程之赛跑游戏

    在JavaSE中,多线程是一个重要的内容. 我们要了解多线程的概念,就要先了解进程的概念:要了解进程的概念,就离不开操作系统的概念. 在一台正常运行的电脑中,计算机硬件(如CPU.内存.硬盘.网卡.显 ...