分享
 
 
 

用汇编轻松地写基于对话框的程序

王朝other·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

用汇编写基于对话框的程序,可以和写VB程序一样清晰简单,并且相当多的程序都是这样的结构。用VB写的所以程序几乎都是这样的。

设计程序界面

和在VC中一样,界面(对话框已经各种控件)一般是以资源的方式存在的。编辑资源文件完全可以使用VC的资源编辑器。但是熟悉一下资源文件的写法及意义是编程所必须的。下面是一个资源文件的例子:

#include "\masm32\include\resource.h"

#define IDC_EDIT 3000

#define IDC_BUTTON 3001

#define IDC_EXIT 3002

MyDialog DIALOG 10, 10, 205, 60

STYLE 0x0004 | DS_CENTER | WS_CAPTION | WS_MINIMIZEBOX |

WS_SYSMENU | WS_VISIBLE | WS_OVERLAPPED | DS_MODALFRAME | DS_3DLOOK

CAPTION "我的对话框"

{

EDITTEXT IDC_EDIT, 15,17,111,13, ES_AUTOHSCROLL | ES_LEFT

DEFPUSHBUTTON "显示编辑框中的内容", IDC_BUTTON, 141,10,52,13

PUSHBUTTON "退出程序", IDC_EXIT, 141,26,52,13

}

记住,在使用QE时为了使得编译成功,必须将它保存为rsrc.rc这个文件名(使用命令行就无所谓了)。选择Project->Compile Resource File。资源文件就编译成功了,就可以被连接使用了。建议你用VC的资源编辑器打开这个资源文件看看。

第一行的#include "\masm32\include\resource.h"就和C一样,是包含一个头文件,这个文件中有各种常数的定义,如PUSHBUOTTON等,感兴趣的话,可以打开这个文件看看。

接下来定义了一些常数,就和C中的用法一样,是为了增强程序的可读性。

"MyDialog DIALOG 10, 10, 205, 60"这一句用DIALOG这个关键字定义一个名为MyDialog的对话框,名字当然可以随便取。后面的4个数字是对话框的位置大小,一般是在资源编辑器中调试。

"STYLE 0x0004 | DS_CENTER | WS_CAPTION | WS_MINIMIZEBOX | WS_SYSMENU | WS_VISIBLE | WS_OVERLAPPED | DS_MODALFRAME | DS_3DLOOK "是描述对话框的风格的。如WS_MINIMIZEBOX是说有最小化按钮。DS_3DLOOK是说对话框是3D外形的等等。这些一般在资源编辑器中改动,各种常数的意义,可以在MSDN中查找。

CAPTION "我的对话框"就是指定对话框的标题是"我的对话框"

再下面用{}框起来的就是对话框中的各个控件。这个例子中用到了EDITTEXT编辑框控件,PUSHBUTTON按钮控件,DEFPUSHBUTTON默认按钮控件(默认选中状态),IDC_EDIT,IDC_EXIT,IDC_BUTTON分别是他们3个的ID号,注意上面的定义,是不能相同的。不一定非要使用#define来预先定义,使用数字也可以,前者可以增强程序的可读性。其他的很多控件如单选框,复选框等等的使用可以在资源编辑器下编辑后查看源代码获得。

程序的界面就设计完了,接下来是设计程序。

程序的设计

我们来做一个简单的程序,在按下“显示编辑框中的内容”这个按钮时,将弹出一个消息框显示现在编辑框中的内容。按“退出程序”按钮将退出程序。

.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这个函数退出程序。

程序就是通过处理各种消息完成的!在更大的程序里面也都是这种结结构,只不过处理的消息更多而已。

我的主页asm.91i.net

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有