• Windows程序设计学习笔记(五)——菜单资源和加速键的使用


    菜单可能是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)...	Alt + F",          IDM_SETFONT
            MENUITEM "背景色(&B)...	Ctrl + 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)	F1",                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键也会显示这样一个消息框,因为我们已经将加速键绑定到对应的菜单项上面。

  • 相关阅读:
    java域名解析
    JDK8新特性面试
    java设计模式--单例模式
    EclipseEE导入项目出现的那些问题
    Eclipse配置Git发布项目到Github
    SVN本地服务器的搭建
    APK的反编译
    Oracle系列--级联删除和级联更新
    Oracle创建表空间和用户
    全方面了解和学习PHP框架 PHP培训教程
  • 原文地址:https://www.cnblogs.com/lanuage/p/7725768.html
Copyright © 2020-2023  润新知