友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!
windows环境下32位汇编语言程序设计-第18部分
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部! 如果本书没有阅读完,想下次继续接着阅读,可使用上方 "收藏到我的浏览器" 功能 和 "加入书签" 功能!
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
;********************************************************************
; 建立并显示窗口
;********************************************************************
invoke CreateWindowEx;WS_EX_CLIENTEDGE;
offset szClassName;offset szCaptionMain;
WS_OVERLAPPEDWINDOW;
100;100;400;300;
NULL;hMenu;hInstance;NULL
mov hWinMain;eax
invoke ShowWindow;hWinMain;SW_SHOWNORMAL
invoke UpdateWindow;hWinMain
;********************************************************************
; 消息循环
;********************************************************************
。while TRUE
invoke GetMessage;addr @stMsg;NULL;0;0
。break 。if eax 0
invoke TranslateAccelerator;hWinMain;
@hAccelerator;addr @stMsg
。if eax 0
invoke TranslateMessage;addr @stMsg
invoke DispatchMessage;addr @stMsg
。endif
。endw
ret
_WinMain endp
;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
start:
call _WinMain
invoke ExitProcess;NULL
;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
end start
来源:电子工业出版社 作者:罗云彬 上一页 回书目 下一页
上一页 回书目 下一页
第5章 使用资源
5。1 菜单和加速键(5)
1。 加载菜单
在窗口中加载菜单的方法在第4章已经提及,方法有两个:一是在注册窗口类的时候指定类的默认菜单;二是在建立窗口的时候在参数中指定菜单句柄。Menu。asm程序中用的是第2种方法:
invoke CreateWindowEx;WS_EX_CLIENTEDGE;
offset szClassName;offset szCaptionMain;
WS_OVERLAPPEDWINDOW;
100;100;400;300;
NULL;hMenu;hInstance;NULL
在参数中指出了hMenu。不管用哪种方法,首先都必须使用LoadMenu函数来获取菜单句柄hMenu,如下面的语句:
invoke LoadMenu;hInstance;IDM_MAIN
mov hMenu;eax
这个函数的第1个参数是用GetModuleHandle获取的实例句柄,第2个参数指定需要装入的菜单资源ID,函数返回菜单句柄。在得到菜单句柄以后,我们先把它放入hMenu变量保存起来以便后用。
当资源文件中用字符串为名称定义菜单而不是用数值的时候,例如:
MainMenu menu //定义菜单名为字符串“MainMenu”
begin
。。。
end
那么在程序中就必须用字符串指针代替菜单ID做参数:
szMenu 〃MainMenu〃;0 ;在数据段中定义菜单名称字符串
。。。
invoke LoadMenu;hInstance;addr szMenu ;在程序中装载
mov hMenu;eax
用字符串为名称定义资源,在资源装载函数LoadXXXX中用字符串指针做参数装入,这实际上是一个通用的方法,不仅适用于菜单资源,对于其他类别的资源也是适用的。在其他资源的介绍中就不再另外说明了。
2。 加载加速键
和菜单一样,加速键在使用前也要装入,参数同样是在资源脚本文件中定义的加速键ID,程序中对应的语句是:
invoke LoadAccelerators;hInstance;IDA_MAIN
mov @hAccelerator;eax
其实我们自己在程序中也可以很方便地实现加速键功能,方法是:在WM_KEYDOWN消息中判断键盘消息并按照自定义的逻辑进行处理,使用加速键实际上是让Windows替我们完成这个功能,Windows实现的方法正是在消息循环中检查WM_KEYDOWN和WM_SYSKEYDOWN消息。下面是使用加速键时消息循环的代码,请注意粗体字部分:
。while TRUE
invoke GetMessage;addr @stMsg;NULL;0;0
。break 。if eax 0
invoke TranslateAccelerator;hWinMain;@hAccelerator;addr @stMsg
。if eax 0
invoke TranslateMessage;addr @stMsg
invoke DispatchMessage;addr @stMsg
。endif
。endw
TranslateAccelerator函数是实现加速键功能的核心,它的参数为目标窗口、加速键句柄和GetMessage取得的消息结构。该函数检查消息结构中的消息,如果遇到WM_KEYDOWN和WM_SYSKEYDOWN消息则检测加速键资源,看按键是否符合某个加速键,符合的话则向目标窗口发送WM_MAND或WM_SYSMAND消息,并返回TRUE,不符合的话不进行任何处理并返回FALSE。
由于加速键的键码并不是用户真正想输入窗口的,比如用户在写字板中输入文字,按Ctrl+C键是为
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!