友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!阅读过程发现任何错误请告诉我们,谢谢!! 报告错误
八万小说网 返回本书目录 我的书架 我的书签 TXT全本下载 进入书吧 加入书签

windows环境下32位汇编语言程序设计-第14部分

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!





图5。1  菜单示意图

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

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

5。1。2  菜单和加速键的资源定义

先来看一个用于演示菜单和加速键使用的例子程序,所有的源文件包含在所附光盘的Chapter05Menu目录下面,运行后产生如图5。1所示的菜单,目录中包括资源脚本文件Menu。rc,汇编源文件Menu。asm,makefile文件和图标、光标等文件,这里是资源脚本文件Menu。rc:

#include                   

#define ICO_MAIN                           Ox1000   //图标

#define IDM_MAIN                           Ox2000   //菜单

#define IDA_MAIN                           Ox2000   //加速键

#define IDM_OPEN                           Ox4101

#define IDM_OPTION               Ox4102

#define IDM_EXIT                           Ox4103   

#define IDM_SETFONT              Ox4201

#define IDM_SETCOLOR             Ox4202

#define IDM_INACT                Ox4203

#define IDM_GRAY                 Ox4204

#define IDM_BIG                  Ox4205

#define IDM_SMALL                Ox4206

#define IDM_LIST                 Ox4207

#define IDM_DETAIL               Ox4208

#define IDM_TOOLBAR              Ox4209

#define IDM_TOOLBARTEXT          Ox4210

#define IDM_INPUTBAR             Ox4211

#define IDM_STATUSBAR            Ox4212

#define IDM_HELP                 Ox4301

#define IDM_ABOUT                Ox4302

//》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

ICO_MAIN  ICON                   〃Main。ico〃

//》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

IDM_MAIN   menu discardable

BEGIN

         popup  〃文件(&F)〃

         BEGIN  

                menuitem         〃打开文件(&O)。。。〃;IDM_OPEN

                menuitem         〃关闭文件(&C)。。。〃;IDM_OPTION

                menuitem         separator

                menuitem         〃退出(&X)〃;IDM_EXIT

         END

         popup  〃查看(&V)〃

         BEGIN

                menuitem         〃字体(&F)。。。tAlt+F〃;IDM_SETFONT

                menuitem         〃背景色(&B)。。。tCtrl+Alt+B〃;IDM_SETCOLOR

                menuitem         separator

                menuitem         〃被禁用的菜单项〃;IDM_INACT;INACTIVE

                menuitem         〃被灰化的菜单项〃;IDM_GRAY;GRAYED

                menuitem         separator

                menuitem         〃大图标(&G)〃;IDM_BIG

                menuitem         〃小图标(&M)〃;IDM_SMALL

                menuitem         〃列表(&L)〃;IDM_LIST

                menuitem         〃详细资料(&D)〃;IDM_DETAIL

                menuitem         separator

                popup            〃工具栏(&T)〃

                BEGIN

                menuitem         〃标准按钮(&S)〃;IDM_TOOLBAR

                   menuitem       〃文字标签(&C)〃;IDM_TOOLBARTEXT

                   menuitem       〃命令栏(&I)〃;IDM_INPUTBAR

                END

                menuitem         〃状态栏(&U)〃;IDM_STATUSBAR

         END

         Popup                   〃帮助(&H)〃 ;HELP

         BEGIN

                menuitem         〃帮助主题(&H)tF1〃;IDM_HELP

                menuitem         separator

                menuitem         〃关于本程序(&A)。。。〃;IDM_ABOUT

         END

END

//》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

IDA_MAIN accelerators

BEGIN

                VK_F1;     IDM_HELP;      VIRTKEY

                〃B〃;       IDM_SETCOLOR;  VIRTKEY;CONTROL;ALT

                〃F〃;       IDM_SETFONT;   VIRTKEY;ALT

END

//》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》



 
来源:电子工业出版社 作者:罗云彬 上一页         回书目         下一页          
上一页         回书目         下一页          
  


第5章 使用资源


5。1 菜单和加速键(2)

    
编译上述文件使用的makefile文件如下:

NAME = Menu

OBJS = (NAME)。obj

RES  = (NAME)。res

 

LINK_FLAG = /subsystem:windows

ML_FLAG = /c /coff

 

(NAME)。exe: (OBJS) (RES)

       Link (LINK_FLAG) (OBJS) (RES)

。asm。obj:

       ml (ML_FLAG) 《

。rc。res:

       rc 《

clean:

       del *。obj

       del *。res

为了编译资源文件,makefile中比以前多了一个资源编译的隐含规则:

。rc。res:

        rc 《

同时在exe文件的依赖文件中增加了Menu。res文件。

在rc文件中,各种语句使用的是C语言的格式,因为资源编译器Rc。exe根本上就是Visual C++附带的(这一点在第2章中就提及过),所以在定义等值语句的时候用的是#define,包含语句使用#include,用到16进制数值的时候并不是用汇编的语法在后面加h,而是用前面加Ox的方法,如1234h写为Ox1234,注释也要用前面加//的方法。这一点在书写的时候一定要注意,以免引起语法错误。

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

1。 菜单的定义

在资源脚本文件中菜单的定义格式是:

菜单ID MENU 'DISCARDABLE'

BEGIN

    菜单项定义

    …

END

“菜单ID MENU 'DISCARDABLE'”语句用来指定菜单的ID值和内存属性,菜单ID可以是16位的整数,范围是1~65 535,在Menu。rc文件中,定义的菜单ID是2000h,但菜单ID也可以用字符串表示,如下面的定义:

MainMenu menu

begin

   menuitem …

end

表示菜单的ID是字符串型的“MainMenu”,但这样定义的话,在程序中引用的时候就要用字符串指针代替16进制的菜单ID值,显得相当不便,所以在实际应用中通常使用16进制数值当做菜单ID。

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

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

菜单项目的定义方法有3类:

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

或   MENUITEM SEPARATOR                   (用法2)

或   POPUP 菜单文字 ',选项列表'             (用法3)

     BEGIN

         item…definitions

     。。。

END

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

●   菜单文字——显示在菜单项中的字符串。如果需要字符串中某个字母带下横线,那么可以在字母前面加&符号,如“字体(F)。。。”就要写成“字体(&F)。。。”,带下横线的字母可以被系统自动当做快捷键:在这里,当菜单打开的时候按下F键,那么就相当于用鼠标选择了“字体”选项。在同一个弹出菜单中要注意不同的菜单项快捷键应该有所区别。另外,如果要把加速键的提示信息显示在菜单项的右边,如“字体”菜单项中的“Alt+F”字符,可以在两者中间加t(表示插入一个Tab字符),写为“字体(&F)。。。tAlt+F”,这样Tab后面的字符在显示的时候会右对齐。

●   命令ID——用来分辨不同的菜单项。当菜单被选中的时候,Windows会向窗口过程发送WM_MAND消息,消息的参数就是这个命令ID。用命令ID可以分辨用户究竟选中了哪个菜单项,所以不同的菜单项应该定义不同的ID值,除非想让两个菜单项的功能相同。

●   选项——用来定义菜单项的各种属性,它可以是下列数值:

CHECKED——表示打上选定标志(对钩)。

GRAYED——表示菜单项是灰化的。

INACTIVE——表示菜单项是禁用的。

MENUBREAK或MENUBARBREAK——表示将这个菜单项和以后的菜单项列到新的列中。

下面做个实验,当把例子中的“详细资料”一句的定义语句改为:

menuitem 〃详细资料(&D)〃;IDM_DETAIL,MENUBARBREAK

显示出来的菜单如图5。2所示。“详细资料”以及以后的菜单项都另起一列了!


图5。2  使用MENUBARBREAK的效果

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

方法3定义的是弹出式菜单,顶层菜单是由多个弹出式子菜单组成的,所以在Menu。rc文件中,主菜单是由“文件”、“查看”和“帮助”3个顺序定义的弹出式菜单组成的,弹出式菜单的定义也可以嵌套,如“查看”菜单中的“工具栏”又是一个弹出式菜单,在嵌套的时候要注意像写C的源程序一样把begin和end(或者{ 和 })正确地配对。popup菜单的选项列表可以是以下的值:

●   GRAYED——表示菜单项是灰化的。

●   INACTIVE——表示菜单项是禁用的。

●   HELP——表示本项和以后的菜单项是右对齐的,如图5。1中的“帮助”菜单。

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

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



 
来源:电子工业出版社 作者:罗云彬 上一页         回书目         下一页          
上一页         回书目         下一页          
  


第5章 使用资源


5。1 菜单和加速键(3)

    
2。 加速键的定义

和菜单的定义相比,加速键的定义要简单得多,具体的语法如下:

加速键ID ACCELERATORS

BEGIN

    键名; 命令ID ',类型' ',选项'

    。。。

END

加速键ID同样可以是一个字符串或者是1~65 535之间的数字,整个定义内容也是用begin和end(或花括号)包含起来,中间是多个加速键的定义项目,每个键占据一行,各字段的含义如下所示。

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

〃^字母〃:表示Ctrl键加上字母键。

〃字母〃:表示字母,这时类型必须指明是VIRTKEY。

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

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

●   类型——用来指定键的定义方式,可以是VIRTKEY和ASCII,分别用来表示“键名”字段定义的是虚拟键还是ASCII码。

●   选项——可以是Alt,Control或Shift中的单个或多个,如果指定多个,则中间用逗号隔开,表示加速键是按键加上这些控制键的组合键。这些选项只能在类型是VIRTKEY的情况下才能使用。

在键名的定义中,系统按键如F1,F2,BackSpace和Esc等都是用虚拟键的方法定义的,Resource。h中已经包括所有的预定义,它们是以VK_带头的一些值,如VK_BACK,VK_TAB,VK_RETURN,VK_ESCAPE,VK_DELETE,VK_F1和VK_F2等,读者可以查看Resource。h文件。下面是加速键定义的一些例子:

〃^C〃;        ID                  ;Ctrl+C

〃K〃;         ID                  ;Shift+K

〃k〃;         ID,ALT             ;Alt+k

98;          ID,ASCII       ;b(字符b的ASCII码为98)

66;          ID,ASCII       ;B (Shift b)

〃g〃;         ID                  ;g

VK_F1;       ID,VIRTKEY     ;F1

VK_F1;       ID,VIRTKEY,CONTROL        ;Ctrl+F1

VK_F2;       ID,VIRTKEY,ALT,SHIFT ;Alt+Shift+F2

在一个资源脚本文件中,可以定义多个菜单和多个加速键表,当然也有其他各式各样的资源,有位图、图标与对话框等,这就涉及为这些资源取ID值的问题,取值的时候要掌握的原则是:

(1)对于同类别的多个资源,资源ID必须为不同的值,如定义了两个菜单,那么它们的ID就必须用不同的数值表示,否则将无法分辨。

(2)对于不同类别的资源,资源ID在数值上可以是相同的,如可以将菜单和加速键的ID都定义为1,同时也可以有ID为1的位图或图标等,Windows并不会把它们搞混。

5。1。3  使用菜单和加速键

在完成资源文件所示的编写后,来看看如何在程序中使用菜单和加速键,例子程序的运行界面如图5。1所示,这里先列出程序的功能说明,读者可以先尝试一下,以便在以下的程序分析中有所印象。程序功能如下:

●   程序在用户选择了任何一个菜单项以后,会弹出一个对话框,将接收到的菜单命令ID显示出来。

●   选择“大图标”、“小图标”、“列表”和“详细资料”菜单项后,选中的菜单项前面会出现一个圆点选中标记,4个菜单项的选择是互斥的。

●   在“状态栏”及“工具栏”菜单的3个菜单项中选择后,选中的菜单项前面会出现对钩标记,它们是不互斥的。

●   在窗口的客户区单击鼠标右键会弹出和“查看”菜单一致的弹出式菜单。

●   在标题栏图标上单击鼠标左键,会弹出系统菜单,注意上面比默认的菜单多了两项:“帮助主题”和“关于本程序”。

接下来,将逐步分析这些功能是如何实现的。下面是Menu。asm源代码,代码是在第4章的FirstWindow程序的基础上改写的,这是编写Win32汇编程序的一个常用方法——拷贝一个模板程序再进行修改会节省很多的时间。

                 。386

                 。model flat; stdcall

                 option casemap :none

;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

; Include 文件定义

;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

include          windows
返回目录 上一页 下一页 回到顶部 7 6
未阅读完?加入书签已便下次继续阅读!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!