当前位置: 首页 > article >正文

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 "点击了菜单:功能01",0 
szMen15     db "点击了子菜单: 功能05",0 


szMen1      db "命令(&C)",0
szMen1_1    db "功能01",0
szMen1_2    db "被禁用的菜单项",0
szMen1_3    db "被灰化的菜单项",0
szMen1_4    db "使上面的禁用有效",0
szMen1_5    db "使上面的灰化有效",0
szMen1_6    db "工具栏",0
szMen1_6_1  db "功能05",0
szMen1_6_2  db "功能06",0

.DATA?                                  
hInstance      HINSTANCE  ?                
CommandLine    LPSTR      ? 

hRootMenu      HMENU      ?
hSubMenu       HMENU      ?          ;要右键单击时弹出的菜单的句柄

hPopupMenu1    HMENU      ?  
hPopupMenu11   HMENU      ? 

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;Equ 等值定义
IDM_011     equ 11
IDM_012     equ 12
IDM_013     equ 13
IDM_014     equ 14
IDM_015     equ 15

IDM_0161    equ 161
IDM_0162    equ 162
       
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.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  
        LOCAL    @stPos:POINT     ;定义一个POINT结构变量,就是鼠标点击时,保存坐标点用的
        
        .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
                invoke AppendMenu,hPopupMenu1,MF_STRING + MF_DISABLED,IDM_012,addr szMen1_2           ;MF_DISABLED 是禁用风格
                invoke AppendMenu,hPopupMenu1,MF_STRING + MF_GRAYED,IDM_013,addr szMen1_3             ;MF_GRAYED 是禁用且灰显状态
                invoke AppendMenu,hPopupMenu1,MF_STRING,IDM_014,addr szMen1_4
                invoke AppendMenu,hPopupMenu1,MF_STRING,IDM_015,addr szMen1_5 
                
                invoke CreatePopupMenu             
                mov hPopupMenu11,eax
                invoke AppendMenu,hPopupMenu1,MF_POPUP,hPopupMenu11,addr szMen1_6 
                invoke AppendMenu,hPopupMenu11,MF_STRING,IDM_0161,addr szMen1_6_1 
                invoke AppendMenu,hPopupMenu11,MF_STRING,IDM_0162,addr szMen1_6_2                      
                                
                invoke SetMenu,hWnd,hRootMenu
        
        invoke    GetSubMenu,hRootMenu,0                                                          ;0是在顶层菜单中的索引,就是第1竖栏菜单。如果是第2栏,则为1,以此类推
        mov    hSubMenu,eax
            
        .elseif    uMsg == WM_COMMAND
            mov eax,wParam      ;wParam的底位字节是标识符
            .if ax == IDM_011
                    invoke MessageBox,NULL,addr szMen11,addr szMsg,MB_OK
            .elseif ax == IDM_014
                    invoke EnableMenuItem,hRootMenu, IDM_012,MF_ENABLED                     ;使禁用的菜单变有效
            .elseif ax == IDM_015
                    invoke EnableMenuItem,hRootMenu, IDM_013,MF_ENABLED                     ;使灰化的菜单变有效 
            .elseif ax == IDM_0161
                    invoke MessageBox,NULL,addr szMen15,addr szMsg,MB_OK                               
            .endif   
    .elseif uMsg == WM_RBUTTONDOWN                                                                  ;WM_RBUTTONDOWN是鼠标右键点击的消息
            invoke    GetCursorPos,addr @stPos                                                ;取得鼠标点击的坐标
            invoke    TrackPopupMenu,hSubMenu,TPM_LEFTALIGN,@stPos.x,@stPos.y,NULL,hWnd,NULL    ;在指定位置显示快捷菜单,并跟踪菜单上项的选择的函数                     
        .elseif uMsg == WM_DESTROY                                         
                invoke PostQuitMessage,NULL                               
        .else 
                invoke DefWindowProc,hWnd,uMsg,wParam,lParam             
        ret 
    .endif 
    xor eax,eax 
    ret 
WndProc endp 
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
end start                                                      
 


http://www.kler.cn/a/558490.html

相关文章:

  • 【java】就近原则
  • vscode@右键文件夹或文件vscode打开一键配置
  • for循环可遍历但不可以修改列表原因分析
  • 物联网常见协议基础学习
  • 【软考】【2025年系统分析师拿证之路】【啃书】第十三章 系统设计(十四)
  • CSS基础(盒子模型的组成、内容溢出、隐藏元素的方式、样式的继承、元素的默认样式、布局技巧、元素之间的空白问题、行内块元素的幽灵空白问题)
  • 利用 AI 大模型驱动企业智能化转型:Cherry Studio 与 Anything LLM 的应用探索
  • 海康威视摄像头ISUP(原EHOME协议) 摄像头实时预览springboot 版本java实现,并可以在浏览器vue前端播放(附带源码)
  • deepseek云端部署及结合本地知识库(结合api调用)可视化界面应用
  • 【拓展】二进制的原码、补码、反码及相互转换方式
  • Linux系统管理与编程01:准备工作
  • 深度学习(3)-TensorFlow入门(梯度带)
  • `pip freeze > requirements.txt` 命令
  • Python 错误和异常处理
  • 正则表达式特殊字符
  • 腾讯SQL面试题解析:如何找出连续5天涨幅超过5%的股票
  • LSTM 与随机森林的对比
  • LeetCode216
  • Python 的 Lambda 函数及应用场景
  • Stm32中SysTick 定时器的使用