win32汇编程序设计中菜单资源的定义

1.菜单的基本概念

        如下图所示,在窗口中,菜单位于标题栏下边。这个菜单称为"主菜单"或者"顶层菜单",图中菜单的菜单项有"文件"、"查看"和"帮助"。单机主菜单上的项目后,可以弹出下一层菜单,叫做"弹出式菜单"或"子菜单"。子菜单中可以继续包含下一层子菜单。如单机"查看"弹出一个自子菜单后,再单机其中的"工具栏"可以继续弹出一个子菜单。在子菜单中可以继续弹出下一层子菜单的菜单项最右边用一个三角箭头表示。

       有的程序在窗口的客户区单机鼠标右键也可以弹出一个菜单,单机标题栏图标也可以弹出一个系统菜单,这些菜单属于弹出式菜单。

       菜单中的菜单有好几种,从资源定义的角度来看,分隔用的横线也是一个菜单项。除横线之外的其他菜单项可以供用户选择,也可以设置为"禁止"或"灰化"状态暂时停用,如图中所示。'"禁用"的菜单项看上去和普通菜单项相同,但无法在上面单机鼠标,"灰化'的菜单项从外观上就已经表示是不可用的。菜单项也可以在左边显示选中标记,如图中的"大图标"前的圆点和"状态栏"前的打勾。远点表示选中标记是互斥的,打钩表示不是互斥的。

                       

        加速键就是菜单项的快捷键,图中的"字体"菜单项右边有个"Alt+F",表示当窗口是激活的时候,不必打开菜单,直接按"Alt"加"F"的组合键就相当于选择了"字体"菜单项。加速键也是资源的组成部分,一般将最常用的菜单项定义为加速键,以减少打开菜单的操作。加速键的定义要遵循惯例,如"Ctrl+C"和"Ctrl+V"一般定义为”拷贝“和”粘贴“,”Ctrl+X“定义为”剪切“等。当然加速键的定会并不是必须的,不定义加速键并不会影响程序的功能。

        不管程序中是否定义加速键,Windows总是定义了几个默认的加速键,如”F10“键会打开窗口的主菜单,”Alt+空格“会打开系统菜单,”Alt+F4“等于单击了”关闭“按钮等。

 2.菜单资源的定义

#include<resource.h>

;可以参见pe的资源表部分

#define ICO_MAIN	1000	;常量定义
#define DLG_MAIN	1000
#define IDC_INFO	1001
#define IDM_MAIN	2000
#define IDM_OPEN	2001
#define IDM_EXIT	2002



#define IDM_1	4000
#define IDM_2	4001
#define IDM_3	4002
#define IDM_4	4003

ICO_MAIN	ICON	"main.ico"	;图标定义

DLG_MAIN DIALOG 50,50,544,199	;对话框定义
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "PE文件基本信息 by qixiaorui"
MENU IDM_MAIN
FONT 9,"宋体"
BEGIN
   CONTROL "",IDC_INFO,"RichEdit20A",196 | ES_WANTRETURN | WS_CHILD | ES_READONLY
               | WS_VISIBLE |WS_BORDER | WS_VSCROLL | WS_TABSTOP,0,0,540,396
END

IDM_MAIN menu discardable	;主菜单定义
BEGIN
  POPUP "文件(&F)"
  BEGIN
    menuitem "打开文件(&O)...",IDM_OPEN
    menuitem separator
    menuitem "退出(&x)",IDM_EXIT
  END

  POPUP "查看"
  BEGIN
    menuitem "源文件",IDM_1
    menuitem "窗口透明度",IDM_2
    menuitem separator
    menuitem "大小",IDM_3
    menuitem "宽度",IDM_4
  END

END

         在资源文件中,各种语句使用的是C语言的格式,因为资源编译器rc.exe根本上就是Visaul C++附带的,所以在定义等值语句的时候用的是#define,包含语句使用#include<文件名>,用到十六进制数值的时候并不是用汇编的语法在后面加h,而是用前面的0x的方法,如1234h写成0x1234,注释也要用前面加//的方法。

       在脚本文件的头部,首先要把MASM32 SDK软件包中的resource.h文件包含进来,这个文件中包括了资源定义中很多的预定义值,如窗口属性与加速键的键值等。资源在程序中的引用往往用一个数值来表示,称为资源的ID值,但在定义的时候直接用数值不是很直观,所以往往用#define语句将数值定义为容易记忆的字符串。

1.菜单的定义

"菜单 ID MENU [DISCARDABLE]"语句用来指定菜单的ID值和内存属性,菜单ID可以是16位的整数,范围是1~65535。但菜单ID也可以用字符串表示,如下面的定义:

 表示菜单的ID是字符串型的”MainMenu“,但这样定义的话,在程序中引用的时候就要用字符串指针代替十六进制的菜单ID值,显得相当不方面(这里也可以实验一下具体使用),所以在实际应用中通常使用十六进制数值当作菜单ID。

数值型ID的范围限制在1~65535之间的原因是字符串在内存中的线性地址总是大于10000h,API函数检测参数时发现小于10000h时就把它认为是数值型的,大于10000h时就当作字符串指针处理。

menu关键字后面的DISCARDABLE是菜单的内存属性,表示菜单在不再使用的时候可以暂时从内存中释放以节省内存,这是一个可选属性。菜单项的定义语句必须包含在begin和end关键字之内,这两个关键字也可以用花括号{}代替。

下面分别就这三种类型详细说明,用法1定义的是普通菜单项,”字体“和”背景色“等菜单项都是这样定义的,它的组成部分如下:

  • 菜单文字——显示在菜单项中的字符串。如果需要字符串中的某个字母带下划线,那么可以在字母前面加&符号,如”字体(F)....“就可以写成”字体(&F)....“,带下划线的字母可以被系统自动当成快捷键:在这里,当菜单打开的时候按下F键,那么就相当于用鼠标选择了”字体“选项。在同一个弹出菜单中要注意不同的菜单项快捷键应该有所区别。另外,如果要把加速键的提示信息显示显示在菜单项的右边,如”字体“菜单项中的”Alt+F“字符,可以在两者之间加\t(表示插入一个tab字符),写为”字体(&F)....\tAlt+F“,这样Tab后面的字符在显示的时候会右对齐。
  • 命令ID——用来分辨不同的菜单项。当菜单被选中的时候,Windows会向窗口过程发送WM_COMMAND消息,消息的参数就是这个命令ID。用命令ID可以分辨用户究竟选中了那个菜单项,所以不同的菜单项应该定义不同的ID值,除非想让两个菜单项的功能相同。
  • 选项——用来定义菜单项的各种属性,它可以是下列数值:

用法2定义的是菜单项之间的分隔线,显然,分隔符是不需要字符串和选项的。

方法3定义的是弹出式菜单,顶层菜单是由多个弹出式菜单组成的,如上面脚本中主菜单由"文件"、”查看“三个顺序定义的弹出式菜单组成,弹出式菜单的定义也可以嵌套。popup菜单的选项列表可以是以下的值:

续表:

由于popup菜单选项选中的时侯会自动将弹出式菜单弹出,不需要向程序发送消息,所以在定义的参数中不需要命令ID。

有些选项是可以同时定义的,如果要指定超过一个选项,中间要用逗号隔开,但是也有些小小的限制,GARYED和INACTIVE不能同时使用,MENUBREAK和MENUBARBREAK也不能同时使用。

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值