友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!
合租小说网 返回本书目录 加入书签 我的书架 我的书签 TXT全本下载 『收藏到我的浏览器』

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键是为
返回目录 上一页 下一页 回到顶部 0 0
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!