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

ops/2025/2/15 20:45:06/

;运行效果

;win32汇编环境,RadAsm入门教程之三
;在这个教程里,我们学一下如何增加控件,比如按钮,其它的控件类似这样增加
;以下的代码就是在教程一的窗口模版里增加一个按钮控件,可以比较一下,增加了什么内容。后面再来理解一下增加的内容。
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.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         

.DATA?                                  
hInstance   HINSTANCE  ?                
CommandLine LPSTR      ?
hButton     HWND       ?                       ;按钮控件句柄变量
.const;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Equ 等值定义
ButtonID   equ 10                              ;按钮控件标识符                
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.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,100,200,25,hWnd,ButtonID,NULL,NULL        ;创建按钮控件                        
                mov hButton,eax
        .elseif uMsg == WM_DESTROY                                           
                invoke PostQuitMessage,NULL                               
        .else 
                invoke DefWindowProc,hWnd,uMsg,wParam,lParam             
        ret 
    .endif 
    xor eax,eax 
    ret 
WndProc endp 
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
end start                                                      

;拿它与教程一的窗口模版代码比较,我们发现多了下面一些内容:
.DATA                                          ;因为下面2个新增的内容是初始化的内容,所以放在.DATA这个数据区里面。当然,在程序运行时也是可以改变的。
szButtonClassName   db "button",0              ;这个是按钮类的类名,按钮也是窗口,它是预定义的控件,就是电脑原来预先定义好的窗口,里面封装了它的内容,简单地说,就是我们不用再单独写它的窗口过程函数,直接引用它就行了。
szButtonTitle       db "我是被测试的按钮",0    ;这是准备显示在按钮上的文字
.DATA?                                         ;这是未初始化的数据区,也叫变量区,就是先给定空间,在后面塞内容。
hButton     HWND       ?                       ;按钮控件句柄变量hButton,现在还不知道这个控件是怎么样的,所以放在未初始化的数据区。HWND指的是窗口,它也是dd类型,即4字节,32位的类型,HWND只不过是个别名。句柄的意思是,代表着按钮,在其它的地方要用这个按钮时,就可以用这个句柄。
.const                                         ;.const的是常量区,就是里面的数据值是固定的,不能改变的。
; Equ 等值定义                                  equ的意思是等同于。
ButtonID   equ 10                              ;按钮控件标识符ButtonID,它等于同10,在代码里引用的时候,把ButtonID换成10,效果是一样的。标识符的意思是,当有几个同类的按钮时,需要区分出哪一个,所以用ButtonID时,即得到10时,就是指这个按钮,而不是另外的按钮。10这个数值是随便设的,你设成1也可以,但不能在有同类时,有相同的值。比如,有3个按钮,你每个都等同于1,就认不出来了。你可以设成Button1 euq 1,Button2 equ 2,Button equ 3的值,在后面引用时就分的出是哪个按钮了。 
.if uMsg == WM_CREATE                          ;这里有个WM_CREATE,这是窗口初始化消息,就是当主窗口创建后,马上要先做什么。这里创建了一个按钮控件,也就是一个为按扭类型的窗口。一般程序运行时需要初始化的数据都放在这个消息里面。                                               
invoke CreateWindowEx,NULL,ADDR szButtonClassName,ADDR szButtonTitle, WS_TABSTOP OR  WS_VISIBLE OR WS_CHILD OR BS_DEFPUSHBUTTON  ,80,100,200,25,hWnd,ButtonID,NULL,NULL        ;创建按钮控件,用的函数和创建主窗口的是一样的,都是CreateWindowEx,但在参数里有WS_CHILD,指的是子窗口的意思,主窗口里面没有这个参数。后面跟着的4个数字,是这个子窗口,即按钮的坐标。这个坐标默认的是最左上角是X坐标是0,Y坐标也是0, X坐标向下递增,Y坐标向右递增。80是指按钮的X坐标起始点是80,Y坐标起始点是100,长度是200,宽度是25。hWnd是父窗口,即主窗口的句柄。里面有个OR,它的意思是并列前后的风格。WS_TABSTOP、WS_VISIBLE这些都是窗口的风格。上网搜一搜,可以看到不同的风格。                       
mov hButton,eax                                ;上面CreateWindowEx函数的返回值在eax里面,所以在调用了函数后,马上把eax的值给前面定义的变量,就是保存返回值。CreateWindowEx函数的返回值是创建的窗口的句柄。把它赋值给hButton,hButton的值就是按钮句柄,后面要使用按钮的时候就可以使用它了。


http://www.ppmy.cn/ops/158690.html

相关文章

MongoDB 常用命令速查表

以下是一份 MongoDB 常用命令速查表&#xff0c;涵盖数据库、集合、文档的增删改查、索引管理、聚合操作等场景&#xff1a; 1. 数据库操作 命令说明show dbs查看所有数据库use <db-name>切换/创建数据库&#xff08;需插入数据后才会显示&#xff09;db.dropDatabase()…

MYSQL直接在SQL提取json字符串中的内容-----将13位时间戳转换成标准的日期格式【记录SQL常用函数】

1.如果表中某个字段中存的是JOSN&#xff0c;那么mysql可以使用JSON_EXTRACT函数来进行字符串的解析。 字段内容如下所示&#xff1a; [{ "tax": { "taxName": "Tax1", "taxAmount": { "amount…

3、《Spring Boot 常见注解详解》

Spring Boot 核心注解详解 摘要 本文深入剖析 Spring Boot 常用注解&#xff0c;如SpringBootApplication、Controller、Service、Repository等&#xff0c;详细讲解它们的功能、使用场景及原理&#xff0c;帮助开发人员更好地理解和运用 Spring Boot 框架进行项目开发。 一…

电商小程序(源码+文档+部署+讲解)

引言 随着移动互联网的快速发展&#xff0c;电商小程序成为连接消费者与商家的重要桥梁。电商小程序通过数字化手段&#xff0c;为消费者提供了一个便捷、高效的购物平台&#xff0c;从而提升购物体验和满意度。 系统概述 电商小程序采用前后端分离的架构设计&#xff0c;服…

2025年3月一区SCI-混沌进化优化算法Chaotic evolution optimization-附Matlab免费代码

引言 本期介绍了一种基于混沌动力学的元启发式算法-混沌进化优化算法Chaotic evolution optimization&#xff0c;CEO。CEO的主要灵感来源于二维离散记忆映射的混沌演化过程。通过利用记忆映射的超混沌特性&#xff0c;对CEO算法进行数学建模&#xff0c;为进化过程引入随机搜…

【认证授权FAQ】SSL/TLS证书过期导致的CLS认证失败

问题现象 问题分析 属于Agent操作系统的根认证机构过期问题&#xff0c;需要下载CA然后在系统安装。 DigiCert根证书和中间证书将在未来几年过期&#xff0c;一旦证书过期&#xff0c;基于证书颁发的SSL/TLS证书将不再信任&#xff0c;导致网站无法HTTPs访问。需要迁移到新的根…

Oracle EBS 11i R12 更改form颜色

前言 Oracle EBS 默认的form颜色为蓝色。目前大部分使用Oracle EBS的企业均已蓝色做为生产环境的颜色。在运维或者测试的过程中&#xff0c;必然需要多个测试环境。如&#xff1a;开发测试、系统测## 二级标题试等。单单靠form上的提示词进行区别&#xff0c;往往不适用于企业…

一文讲清前端热更新

​​​​​​ 引言 前端开发中&#xff0c;“保存代码后页面自动刷新”早已成为开发者的标配体验。但你是否思考过&#xff0c;为什么某些场景下修改代码后页面无需完全刷新&#xff0c;甚至能保留当前状态&#xff08;如表单输入、滚动位置&#xff09;&#xff1f;这背后的…