用汇编写基于对话框的程序,可以和写VB程序一样清晰简单,并且相当多的程序都是这样的结构。用VB写的所以程序几乎都是这样的
。设计程序界面 和在VC中一样,界面(对话框已经各种控件)一般是以资源的方式存在的。编辑资源文件完全可以使用VC的资源编辑器。但是熟悉 一下资源文件的写法及意义是编程所必须的。下面是一个资源文件的例子: #include "masm32includeresource.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 "masm32includeresource.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 masm32includewindows.inc include masm32includeuser32.inc include masm32includekernel32.inc includelib masm32libuser32.lib includelib masm32libkernel32.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的编译器自动帮你做了这些工作。 <  
1/2 1 2 下一页 尾页 |