WIN32汇编语言教程:第05章 使用资源 · 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_COMMAND
                        invoke _DisplayMenuItem,wParam
                       mov    eax,wParam
                        movzx  eax,ax
                        .if    eax == IDM_EXIT
                        call   _Quit
                .elseif eax >= IDM_TOOLBAR && eax <= IDM_STATUSBAR
                        mov    ebx,eax
                        invoke GetMenuState,hMenu,ebx,MF_BYCOMMAND
                        .if    eax == MF_CHECKED
                               mov      eax,MF_UNCHECKED
                         .else
                                mov      eax,MF_CHECKED
                         .endif
                         invoke CheckMenuItem,hMenu,ebx,eax
                .elseif eax >= IDM_BIG && eax <= IDM_DETAIL
                        invoke CheckMenuRadioItem,hMenu,\
                                IDM_BIG,IDM_DETAIL,eax,MF_BYCOMMAND
                .endif
;********************************************************************
; 处理系统菜单消息
;********************************************************************
          .elseif   eax == WM_SYSCOMMAND
                     mov   eax,wParam
                     movzx eax,ax
                    .if   eax == IDM_HELP || eax == IDM_ABOUT
                           invoke _DisplayMenuItem,wParam
                    .else
                           invoke DefWindowProc,hWnd,uMsg,wParam,lParam
                           ret
                    .endif
;********************************************************************
; 单击鼠标右键时弹出一个POPUP菜单
;********************************************************************
          .elseif   eax == WM_RBUTTONDOWN
                     invoke GetCursorPos,addr @stPos
                     invoke TrackPopupMenu,hSubMenu,TPM_LEFTALIGN,\
                            @stPos.x,@stPos.y,NULL,hWnd,NULL
;********************************************************************
          .elseif   eax == WM_CLOSE
                    call   _Quit
;********************************************************************
          .else
                    invoke DefWindowProc,hWnd,uMsg,wParam,lParam
                    ret
          .endif
;********************************************************************
          xor       eax,eax
          ret
 
_ProcWinMain    endp
;####################################################################
_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

上页:第05章 使用资源 · 5.1 菜单和加速键(3) 下页:第05章 使用资源 · 5.1 菜单和加速键(5)

第05章 使用资源

版权所有 © 云南伯恩科技 证书:粤ICP备09170368号