win32汇编环境,窗口程序中使用菜单示例一

;运行效果

;win32汇编环境,窗口程序中使用菜单示例一
;最基本的应用,即添加菜单及点击后响应的操作方法
;直接抄进RadAsm可编译运行。重要部分加备注。
;下面为asm文件
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.386 
.model flat,stdcall 
option casemap:none 
include      windows.inc 
include      user32.inc
include      kernel32.inc 
 
includelib   user32.lib           
includelib   kernel32.lib 
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
WinMain proto :DWORD,:DWORD,:DWORD,:DWORD       
                                                
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.DATA                                   
ClassName   db "SimpleWinClass",0        
AppName     db "窗口程序的模版",0

szMsg       db "提示",0
szMen11     db "点击了菜单:开始",0 
szMen21     db "点击了菜单: 功能01",0 

szMen1      db "文件(&F)",0
szMen1_1    db "开始",0
szMen1_2    db "退出",0

szMen2      db "命令(&C)",0
szMen2_1    db "功能01",0
szMen2_2    db "功能02",0
szMen2_3    db "功能03",0

szMen3      db "帮助(&H)",0 
szMen3_1    db "主题",0       

.DATA?                                  
hInstance      HINSTANCE  ?                
CommandLine    LPSTR      ? 

hRootMenu      HMENU      ?
hPopupMenu1    HMENU      ?  
hPopupMenu2    HMENU      ? 
hPopupMenu3    HMENU      ?

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;Equ 等值定义
IDM_011     equ 11         ;某顶的标识符
IDM_012     equ 12
IDM_021     equ 21
IDM_022     equ 22
IDM_023     equ 23
IDM_031     equ 31          
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.CODE                      

start:                      
invoke GetModuleHandle, NULL                                                    
mov hInstance,eax 
invoke GetCommandLine                                                                                       
mov CommandLine,eax 
invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT        
invoke ExitProcess, eax                                          
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD 
        LOCAL wc:WNDCLASSEX                                          
        LOCAL msg:MSG 
        LOCAL hwnd:HWND 

        mov   wc.cbSize,SIZEOF WNDCLASSEX                            
        mov   wc.style, CS_HREDRAW or CS_VREDRAW                     
        mov   wc.lpfnWndProc, OFFSET WndProc                        
        mov   wc.cbClsExtra,NULL 
        mov   wc.cbWndExtra,NULL 
        push  hInstance 
        pop   wc.hInstance 
        mov   wc.hbrBackground,COLOR_WINDOW 
        mov   wc.lpszMenuName,NULL 
        mov   wc.lpszClassName,OFFSET ClassName 
        invoke LoadIcon,NULL,IDI_APPLICATION                          
        mov   wc.hIcon,eax 
        mov   wc.hIconSm,eax 
        invoke LoadCursor,NULL,IDC_ARROW                              
        mov   wc.hCursor,eax 
        invoke RegisterClassEx, addr wc                              
        invoke CreateWindowEx,NULL, ADDR ClassName,ADDR AppName,WS_OVERLAPPEDWINDOW,100,100,400,300, NULL,NULL,hInst, NULL 
        mov   hwnd,eax 
        invoke ShowWindow, hwnd,CmdShow                              
         invoke UpdateWindow, hwnd                                    

        .while TRUE                                                   
                invoke GetMessage, ADDR msg,NULL,0,0 
                .break .if (!eax) 
                invoke TranslateMessage, ADDR msg 
                invoke DispatchMessage, ADDR msg 
        .endw 
        mov     eax,msg.wParam                                         
        ret 
WinMain endp 
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM  
        .if uMsg == WM_CREATE
                invoke CreateMenu                   ;创建根菜单
                mov hRootMenu,eax      
                          
                invoke CreatePopupMenu              ;创建下拉式菜单,//竖立的弹出菜单,通常作为另一个菜单的子菜单或右键菜单的顶级菜单
                mov hPopupMenu1,eax                
                invoke AppendMenu,hRootMenu,MF_POPUP,hPopupMenu1,addr szMen1   ;把下拉式菜单添加到根菜单里去                
              
                invoke AppendMenu,hPopupMenu1,MF_STRING,IDM_011,addr szMen1_1  ;给下拉式菜单加上第1项
                invoke AppendMenu,hPopupMenu1,MF_STRING,IDM_012,addr szMen1_2  ;给下拉式菜单加上第2项
                
                invoke CreatePopupMenu             
                mov hPopupMenu2,eax
                invoke AppendMenu,hRootMenu,MF_POPUP,hPopupMenu2,addr szMen2
                invoke AppendMenu,hPopupMenu2,MF_STRING,IDM_021,addr szMen2_1
                invoke AppendMenu,hPopupMenu2,MF_STRING,IDM_022,addr szMen2_2
                invoke AppendMenu,hPopupMenu2,MF_STRING,IDM_023,addr szMen2_3
                
                invoke CreatePopupMenu             
                mov hPopupMenu3,eax
                invoke AppendMenu,hRootMenu,MF_POPUP,hPopupMenu3,addr szMen3
                invoke AppendMenu,hPopupMenu3,MF_STRING,IDM_031,addr szMen3_1
                
                invoke SetMenu,hWnd,hRootMenu
                
        .elseif    uMsg == WM_COMMAND
            mov eax,wParam      ;wParam的底位字节是标识符
            .if ax == IDM_011
                    invoke MessageBox,NULL,addr szMen11,addr szMsg,MB_OK
            .elseif ax == IDM_021
                    invoke MessageBox,NULL,addr szMen21,addr szMsg,MB_OK
            .elseif ax == IDM_012
                    invoke PostQuitMessage,NULL                
            .endif            
        .elseif uMsg == WM_DESTROY                                           
                invoke PostQuitMessage,NULL                               
        .else 
                invoke DefWindowProc,hWnd,uMsg,wParam,lParam             
        ret 
    .endif 
    xor eax,eax 
    ret 
WndProc endp 
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
end start                                                      

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一品人家

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值