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

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

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




; 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

;********************************************************************

; 建立并显示窗口

;********************************************************************

                 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键是为了“拷贝”,而并�
返回目录 上一页 下一页 回到顶部 赞(11) 踩(8)
未阅读完?加入书签已便下次继续阅读!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!