windows环境下32位汇编语言程序设计-第16章
按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
加速键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。inc
include user32。inc
includelib user32。lib
include kernel32。inc
includelib kernel32。lib
;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
; Equ 等值定义
;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
ICO_MAIN equ 1000h ;图标
IDM_MAIN equ 2000h ;菜单
IDA_MAIN equ 2000h ;加速键
IDM_OPEN equ 4101h
IDM_OPTION equ 4102h
IDM_EXIT equ 4103h
IDM_SETFONT equ 4201h
IDM_SETCOLOR equ 4202h
IDM_INACT equ 4203h
IDM_GRAY equ 4204h
IDM_BIG equ 4205h
IDM_SMALL equ 4206h
IDM_LIST equ 4207h
IDM_DETAIL equ 4208h
IDM_TOOLBAR equ 4209h
IDM_TOOLBARTEXT equ 4210h
IDM_INPUTBAR equ 4211h
IDM_STATUSBAR equ 4212h
IDM_HELP equ 4301h
IDM_ABOUT equ 4302h
;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
; 数据段
;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
。data?
hInstance dd ?
hWinMain dd ?
hMenu dd ?
hSubMenu dd ?
nst
szClassName db 'Menu Example';0
szCaptionMain db 'Menu';0
szMenuHelp db '帮助主题(&H)';0
szMenuAbout db '关于本程序(&A)。。。';0
szCaption db '菜单选择';0
szFormat db '您选择了菜单命令:%08x';0
;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
; 代码段
;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
de
;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
_DisplayMenuItem proc _dwmandID
local @szBuffer'256':byte
pushad
invoke wsprintf;addr @szBuffer;addr szFormat;_dwmandID
invoke MessageBox;hWinMain;addr @szBuffer;
offset szCaption;MB_OK
来源:电子工业出版社 作者:罗云彬 上一页 回书目 下一页
上一页 回书目 下一页
第5章 使用资源
5。1 菜单和加速键(4)
popad
ret
_DisplayMenuItem endp
;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
_Quit proc
invoke DestroyWindow;hWinMain
invoke PostQuitMessage;NULL
ret
_Quit endp
;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
_ProcWinMain proc uses ebx edi esi hWnd;uMsg;wParam;lParam
local @stPos:POINT
local @hSysMenu
mov eax;uMsg
。if eax WM_CREATE
invoke GetSubMenu;hMenu;1
mov hSubMenu;eax
;********************************************************************
;在系统菜单中添加菜单项
;********************************************************************
invoke GetSystemMenu;hWnd;FALSE
mov @hSysMenu;eax
invoke AppendMenu;@hSysMenu;MF_SEPARATOR;0;NULL
invoke AppendMenu;@hSysMenu;
0;IDM_HELP;offset szMenuHelp
invoke AppendMenu;@hSysMenu;
0;IDM_ABOUT;offset szMenuAbout
;********************************************************************
; 处理菜单及加速键消息
;********************************************************************
。elseif eax WM_MAND
invoke _DisplayMenuItem;wParam
mov eax;wParam
movzx eax;ax
。if eax IDM_EXIT
call _Quit
。elseif eax 》= IDM_TOOLBAR && eax = IDM_BIG && eax 》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
_WinMain proc
local @stWndClass:WNDCLASSEX
local @stMsg:MSG
local @hAccelerator
invoke GetModuleHandle;NULL
mov hInstance;eax
invoke LoadMenu;hInstance;IDM_MAIN
mov hMenu;eax
invoke LoadAccelerators;hInstance;IDA_MAIN
mov @hAccelerator;eax
;********************************************************************
; 注册窗口类
;********************************************************************
invoke RtlZeroMemory;addr @stWndClass;sizeof @stWndClass
invoke LoadIcon;hInstance;ICO_MAIN
mov @stWndClass。hIcon;eax
mov @stWndClass。hIconSm;eax
push hInstance
pop @stWndClass。hInstance
mov @stWndClass。cbSize;sizeof WNDCLASSEX
mov @stWndClass。style;CS_HREDRAW or CS_VREDRAW
mov @stWndClass。lpfnWndProc;offset _ProcWinMain
mov @stWndClass。hbrBackground;COLOR_WINDOW + 1
mov @stWndClass。lpszClassName;offset szClassName
invoke RegisterClassEx;addr @stWndClass
;********************************************************************
; 建立并显示窗口
;********************************************************************