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章 使用资源
版权所有 © 云南伯恩科技 证书:粤ICP备09170368号