学写基于对话框的程序
2008-04-28 09:32:08 来源:WEB开发网程序的设计
我们来做一个简单的程序,在按下“显示编辑框中的内容”这个按钮时,将弹出一个消息框显示现在编辑框中的内容。按“退出
程序”按钮将退出程序。
.386
.model flat,stdcall
option casemap:none
DlgProc proto :DWORD,:DWORD,:DWORD,:DWORD
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
.data
DlgName db "MyDialog",0
AppName db "My own dialog",0
.data?
hInstance HINSTANCE ?
buffer db 512 dup(?)
.const
IDC_EDIT equ 3000
IDC_BUTTON equ 3001
IDC_EXIT equ 3002
.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
.IF uMsg==WM_INITDIALOG
invoke GetDlgItem, hWnd,IDC_EDIT
invoke SetFocus,eax
.ELSEIF uMsg==WM_CLOSE
invoke EndDialog, hWnd,NULL
.ELSEIF uMsg==WM_COMMAND
mov eax,wParam
.IF eax==IDC_BUTTON
invoke GetDlgItemText,hWnd,IDC_EDIT,ADDR buffer,512
invoke MessageBox,NULL,ADDR buffer,ADDR AppName,MB_OK
.ELSEIF ax==IDC_EXIT
invoke EndDialog, hWnd,NULL
.ENDIF
.ELSE
mov eax,FALSE
ret
.ENDIF
mov eax,TRUE
ret
DlgProc endp
end start
猛一看,这个程序挺长的,如果用VB实现这个功能的话,大概只需要写5-6行。但是,这个程序中相当一部分代码是固定的,也
就是说,写任何基于对话框的程序都需要这样写。VB中正是VB的编译器自动帮你做了这些工作。
.386; 声明使用386指令系统
.model flat,stdcall;声明内存的寻址方式
option casemap:none;声明是否对大小写敏感
;上面3行可以认为是固定的,必须的
DlgProc proto :DWORD,:DWORD,:DWORD,:DWORD
;..........此处声明自己定义的函数,上面的这个是对话框的主函数(必须有),名字可以换成别的
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
;...........此处包含需要的头文件,上面几个是最长用到的
.data
DlgName db "MyDialog",0
AppName db "My own dialog",0
;............这里定义各个预先赋值的变量,db是定义一个字节长,dw是定义一个字长等等,还有很多类型的宏定义,包含在
windows.h中。
.data?
hInstance HINSTANCE ?
;............这里定义各个变量,但是是没有预先赋值的
.const
;..........如果需要预先定义一些常量,放在这段里面,用关键字equ定义
.code ;以下就是代码段,注意函数也是放在代码段里面的!
start:;不一定非要使用start,可以是任何的字符串如begin,entry等等。
invoke GetModuleHandle, NULL
mov hInstance,eax
invoke DialogBoxParam, hInstance, ADDR DlgName,NULL, addr DlgProc, NULL
invoke ExitProcess,eax
上面的几行也是比较固定的,invoke是用来调用函数的,用过VB的人都知道call,这就相当于那个命令
DlgProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
;..............这是你主要集中精力要写的地方
DlgProc endp
end start;主要和上面的start对应
基本上,你可以把上面的绿色部分当作模版使用,只需要在.data和.data?以及.const段增加你所需要的变量和常量就可以了。
剩下的任务就是写上面红色的部分,也就是处理各个消息。
我们来分析几个消息,在调用DialogBoxPrarm创建对话框后,对话框会收到WM_INITDIALOG即对话框初始化消息,uMsgz这个参数
接受到消息。在这个程序中,我们用GetDlgItem这个函数来取得编辑框控件的句柄,然后调用SetFocus来将焦点设置在它上面。
注意这些函数都是API函数,这些函数的意义都可以在msdn中找到。
当按下对话框右上角的关闭按钮时,会产生WM_CLOSE,必须处理这个函数,否则不能用×来关闭对话框(这是由于内置的函数没
有设计处理这个消息),而对于最大化最小化等消息则有默认的处理。
当按下对话框上的按钮时会产生WM_COMMAND消息,并且wParam中传递的是控件的ID。根据不同的ID完成不同的功能,在本例中如
果是IDC_BUTTON这个ID说明是显示编辑框内容的控件按钮被按下,这样就执行GetDlgItemText函数得到编辑框的内容,然后用
messagebox来显示。如果是IDC_EXIT说明按下了“退出程序”这个按钮,则执行EndDialog这个函数退出程序。
程序就是通过处理各种消息完成的!在更大的程序里面也都是这种结结构,只不过处理的消息更多而已。
- ››基于IP地址的vsftp服务器
- ››基于MySQL 水平分区的优化示例
- ››基于CentOS5的Linux下pptp和openvpn的搭建及配置
- ››基于JavaScript的网页版塔防游戏
- ››基于Android平台 QQ大战360手机游戏爆红
- ››基于Windows Azure的云计算应用设计
- ››基于AES算法实现对数据的加密
- ››基于SoPC目标板Flash编程设计的创建及应用
- ››基于SolidWarks齿轮机构的运动分析与仿真
- ››基于Windwos Server 2008故障转移群
- ››基于JavaScript的REST客户端框架
- ››基于JavaScript和CSS的Web图表框架横向对比
更多精彩
赞助商链接