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

RadASM环境,win32汇编入门教程之四

;运行效果

;RadASM环境,win32汇编入门教程之四
;在教程三里面,我们学了如何增加控件,学了增加1个按钮,但是它只能显示出来,却没有功能。现在我们给它加点儿功能。
;在这个教程里,学一下给按钮增加点击后改变按钮上的文字,和让按钮无效
;下面的代码就是示例,我们可以把它和教程三的代码比较一下,看看有什么变化,然后研究一下变化的内容是什么意思。
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.386 
.model flat,stdcall 
option casemap:none 
include      windows.inc 
include      user32.inc 
includelib   user32.lib           
include      kernel32.inc 
includelib   kernel32.lib 
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
WinMain proto :DWORD,:DWORD,:DWORD,:DWORD       
                                                
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.DATA                                   
ClassName           db "SimpleWinClass",0        
AppName             db "窗口程序的模版",0
szButtonClassName   db "button",0              ;按钮类名
szButtonTitle       db "我是被测试的按钮",0    
     
szButtonTitle01     db "我是改变后的文字",0    ;新增的内容
szButtonTitle02     db "按钮2",0               ;新增的内容
szButtonTitle03     db "按钮3",0               ;新增的内容
.DATA?                                  
hInstance   HINSTANCE  ?                
CommandLine LPSTR      ?
hButton     HWND       ?                       ;按钮控件句柄变量
hButton01   HWND       ?                       ;新增的内容
hButton02   HWND       ?                       ;新增的内容
.const;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Equ 等值定义
ButtonID     equ 10                            ;按钮控件标识符
ButtonID01   equ 11
ButtonID02   equ 12                            ;新增的内容               
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.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 CreateWindowEx,NULL,ADDR szButtonClassName,ADDR szButtonTitle, WS_TABSTOP OR  WS_VISIBLE OR WS_CHILD OR BS_DEFPUSHBUTTON  ,80,40,200,25,hWnd,ButtonID,NULL,NULL        ;创建按钮控件                        
                mov hButton,eax
                
                invoke CreateWindowEx,NULL,ADDR szButtonClassName,ADDR szButtonTitle02, WS_TABSTOP OR  WS_VISIBLE OR WS_CHILD OR BS_DEFPUSHBUTTON  ,80,100,200,25,hWnd,ButtonID01,NULL,NULL        ;创建按钮控件二                        
                mov hButton01,eax
                
                invoke CreateWindowEx,NULL,ADDR szButtonClassName,ADDR szButtonTitle03, WS_TABSTOP OR  WS_VISIBLE OR WS_CHILD OR BS_DEFPUSHBUTTON  ,80,140,200,25,hWnd,ButtonID02,NULL,NULL        ;创建按钮控件三                        
                mov hButton02,eax
        .elseif uMsg == WM_COMMAND       
                mov eax,wParam        
                .if  ax == ButtonID01
                        invoke SendMessage,hButton,WM_SETTEXT,0,addr szButtonTitle01      ;改变第1个按钮的文字 
                .elseif  ax == ButtonID02 
                        invoke  EnableWindow,hButton,FALSE                                ;使第1个按钮按钮无效       
                .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      
;在与教程三比较后发现,这里多了以下这一段                                          
        .elseif uMsg == WM_COMMAND       
                mov eax,wParam        
                .if     ax == ButtonID01
                        invoke SendMessage,hButton,WM_SETTEXT,0,addr szButtonTitle01      ;改变第1个按钮的文字 
                .elseif  ax == ButtonID02 
                        invoke  EnableWindow,hButton,FALSE                                ;使第1个按钮按钮无效       
                .endif 
;这里的uMsg就是前面WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM 里的第2个参数,就是传到这个窗口函数里来的消息
;消息有很多不同的种类,所以要分别处理。这个是WM_COMMAND消息,就是命令消息的意思。hWnd则是传进来的窗口句柄,这里指的是主窗口句柄。
;与它同时传进来的还有wParam和lParam,wParam的值是消息码,总共有4个字节,其中低位的2个字节是标识符,高位的2个字节是消息码,就是单击或双击的
;mov eax,wParam 是把wParam的值给eax,然后判断ax的值是哪个控件的标识符。ax是eax的低的2个字节。
;本来还要判断eax的高位2字节是什么内容,这里直接偷懒了,不管它是单击还是双击,只要是按钮标识符为ButtonID01的消息,直接发送消息给指定的按钮
;invoke SendMessage,hButton,WM_SETTEXT,0,addr szButtonTitle01这一句就是发送WM_SETTEXT消息给句柄为hButton,即第1个按钮,WM_SETTEXT是改变窗口内容的消息。addr szButtonTitle01是附带的新的内容。
;而lParam的值则是控件句柄,如果有多个不同的控件,比如既有按钮,又有编辑框,那这个就要用的上。
;这里偷了个懒,因为没有其它控件了,就不管lParam参数了。 
;invoke  EnableWindow,hButton,FALSE 这句是直接调用函数让某窗口无效,这里的窗口是第1个按钮。也可以像前面那样,通过发送消息让窗口无效。               


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

相关文章:

  • CAS单点登录(第7版)24.高可用性
  • C语言中的文件
  • C#学习之S参数读取(s2p文件)
  • Selenium自动化测试入门:python unittest 单元测试框架
  • 数字内容体验优化策略:全渠道整合与高效转化实践
  • 草图绘制技巧
  • 【linux】Socket网络编程
  • vue使用v-chart的实践心得
  • 【Elasticsearch】keyword分析器
  • 【ISO 14229-1:2023 UDS诊断全量测试用例清单系列:第二十节】
  • C语言表驱动法
  • 为什么vue3需要对引入的组件使用markRaw?
  • Java NIO基础与实战:如何提升IO操作性能
  • 【openGauss】6.0.0企业版单节点安装,配置刷新
  • 【鸿蒙HarmonyOS Next实战开发】lottie动画库
  • 【Python爬虫(3)】解锁Python爬虫技能树:深入理解模块与包
  • 20250214在ubuntu20.04下使用obs studio录制外挂的1080p的USB摄像头【下载安装】
  • PDF工具,个人作品,免费分享
  • 教程 | 从零部署到业务融合:DeepSeek R1 私有化部署实战指南
  • (rancher) k8s ingress 屏蔽 nginx版本信息