;运行效果
;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