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

;运行效果

;RadASM环境,win32汇编入门教程之十三
;在这一教程里,我们来学习一下给对话框加上图标,同时了解一下窗口的样式问题
;我们有心的话,会发现上一教程的对话框,少了一些东西
;比如左上角的图标很丑,那是默认的程序图标
;又比如,这个对话框似乎没有最小化和最大化按钮
;那么,我们添加这2个功能,加入自定义的图标,同时加上最小化的按钮

.386 
.model flat,stdcall 
option casemap:none 

include    windows.inc 
include    user32.inc 
include    kernel32.inc
 
includelib user32.lib 
includelib kernel32.lib 

;EQU等值定义
IDB01      equ 101
IDB02      equ 102
ICO_MAIN   equ 1000    ;图标
;函数声明
DlgProc proto :DWORD,:DWORD,:DWORD,:DWORD   ;对话框窗口函数

.data 
DlgName    db "MyDialog",0

szMsg      db "提示",0
szFrm      db "计算结果是 %d",0
sz01       db "点击了第1个按钮",0
sz02       db "单击了第2个按钮",0
.data? 
hInstance HINSTANCE             ? 


.const 


.code 
start: 
         invoke GetModuleHandle, NULL 
         mov    hInstance,eax 
         invoke DialogBoxParam, hInstance, ADDR DlgName,NULL, addr DlgProc, NULL 
         invoke ExitProcess,eax 

DlgProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM 
        LOCAL @szBuffer[256]:byte
        LOCAL @hico
        
        .if     uMsg == WM_INITDIALOG 
                invoke    LoadIcon,hInstance,ICO_MAIN
                mov @hico,eax    
            invoke    SendMessage,hWnd,WM_SETICON,ICON_SMALL,@hico
            invoke    SendMessage,hWnd,WM_SETICON,ICON_BIG,@hico
        .elseif uMsg == WM_COMMAND
            mov eax,wParam                 ;wParam的底位字节是标识符
            mov ebx,lParam              
            .if ax == IDB01                ;进行减法运算
                   mov bx,10
                   mov ax,1
                   sub ax,bx                  
                   invoke wsprintf,addr @szBuffer,addr szFrm,ax
                       invoke MessageBox,NULL,addr @szBuffer,addr szMsg,MB_OK      
                .elseif ax == IDB02
                       mov ax,10
                   mov bx,1
                   sub ax,bx                
                   invoke wsprintf,addr @szBuffer,addr szFrm,ax
                       invoke MessageBox,NULL,addr @szBuffer,addr szMsg,MB_ICONINFORMATION + MB_OK     
                .endif      

        .elseif uMsg == WM_CLOSE 
                invoke EndDialog, hWnd,NULL 
        .else 
                mov eax,FALSE 
                ret 
        .endif 
                mov eax,TRUE 
        ret 
DlgProc endp 

end start 
;在Rc文件里面,我们看一下,有哪些增加的语句
;#define    ICO_MAIN      1000  这一句,它的意思是定义 ICO_MAIN 的值为1000,你定义为其它值也可以
;但是,要和Asm文件里的EQU等值定义的相同
;在Asm文件里,则有 ICO_MAIN   equ 1000 ,这句是等值定义,就是后面的 ICO_MAIN相当于1000的值
;这个值的定义是因为后面的 LoadIcon 函数要使用。

;ICO_MAIN  ICON   "Main.ico" 这一句的意思是,定义一个变量名为ICO_MAIN,其文件名为 Main 的图标文件。
;这个图标是32*32像素的,位深度为32的图标,位深度的意思是它的每个像素点的颜色值用32位,就是4个字节来表达
;简单地说,就是位数越高,能表达的值就越大,如果用来表达颜色,也即能表达更多的颜色值。也意味着图片更清晰。
;我们可以自已在网上下载图标,然后对它点右键,看属性,看详细信息,里面就有这些数据
;然后这个图标放在程序的文件夹里,它才会一起编译。

;在Asm文件里有,在窗口函数DlgProc里,先定义一个变量 LOCAL @hico
;在WM_INITDIALOG,即初始化对话框的消息下面,有这些句子

;invoke    LoadIcon,hInstance,ICO_MAIN
;mov @hico,eax    
;invoke    SendMessage,hWnd,WM_SETICON,ICON_SMALL,@hico
;invoke    SendMessage,hWnd,WM_SETICON,ICON_BIG,@hico

;就是加载这个图标和发送消息给窗口,设置这个图标
;先通过LoadIcon函数把图标加载进来,然后给窗口设置大图标和小图标。大图标就是按ALT+TAB键时,显示出的图标。小图标就是在程序左上角和最小化时显示的图标

;通过这两句,就可以给程序加上图标

;回个头来看看Rc文件,我们看这一句
;STYLE  WS_SYSMENU|WS_CAPTION|WS_MINIMIZEBOX|WS_BORDER|DS_CENTER|DS_SETFONT|DS_3DLOOK 
;这个是定义对话框的风格,我们可以随便复制一个,到网上去搜一下,就可以看到其它相邻的风格
;这里的,比如WS_SYSMENU,就是让对话框有系统菜单。
;比如WS_CAPTION,就是让对话框有标题
;比如WS_MINIMIZEBOX,就是让对话框有最小化按钮。
;比如DS_CENTER,就是让对话框显示在屏幕的中心位置。
;这些风格用 | 符号隔开,就是可以同时存在的意思。

;Rc资源文件与Asm汇编文件不一样,资源文件使用C语言的格式,所以在语法上有些不同。

;以下是资源Rc文件内容
#include "resource.h"

#define    ICO_MAIN      1000    //图标

#define IDB01 101
#define IDB02 102

ICO_MAIN    ICON        "Main.ico"

MyDialog DIALOGEX 10, 10, 110, 120 
STYLE  WS_SYSMENU|WS_CAPTION|WS_MINIMIZEBOX|WS_BORDER|DS_CENTER|DS_SETFONT|DS_3DLOOK 
CAPTION "我是对话框程序"
FONT 12, "方正姚体" 
BEGIN 
     PUSHBUTTON "计算 10-1 ",IDB01,10,30,90,12 
     
     CONTROL    "计算 10-1 ",IDB02,"button",WS_CHILDWINDOW|WS_VISIBLE,10,60,90,12
END 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

一品人家

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

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

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

打赏作者

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

抵扣说明:

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

余额充值