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

原创 2003年02月24日 09:13:00

设计程序界面
  • 和在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

WIN32汇编对话框的使用

刚开始接触windows下的对话框,第一感觉就像是一个一般的窗口一样,没有图标,只有一个框框,中间有一些提示的控件(按钮,输入的文本框等)信息,在学习使用对话框的时候,资源文件的编写我感觉比编写实现对...
  • qq_22642239
  • qq_22642239
  • 2016年03月25日 20:09
  • 812

WIN32汇编语言之通用对话框的使用

以前学习过自定义的对话框,属性需要自己定义,包括边框,标题,模态与非模态等等,如果创建模态对话框(windows为它内建的消息循环),你不用再去自己写消息循环与注册窗口和显示窗口这几个部分,可以很好的...
  • qq_22642239
  • qq_22642239
  • 2016年04月22日 11:54
  • 1565

弹出窗口大全

【1、最基本的弹出窗口代码】  其实代码非常简单:    window.open (page.html)  -->    因为着是一段javascripts代码,所以它们应该放在标签和之间。是对一些版...
  • 21aspnet
  • 21aspnet
  • 2004年10月25日 10:37
  • 29139

使用WIN32汇编语言实现一个基本windows窗口的过程分析

一个常规的windows窗口一般都是一些一样的构造,你如果想要更改一些个性化的设置,你可以在这个一般的模板伤添砖加瓦,构造自己比较喜欢的类型,下边就分析一下一般的windows窗口的一般模板。 一...
  • qq_22642239
  • qq_22642239
  • 2016年03月07日 20:55
  • 2445

再探MFC(一)基于对话框的MFC应用程序项目框架

大学毕设时学的MFC,工作头一年还用的MFC,之后再也用不到了.当时买的MFC书籍早就束之高阁了.现在需要开发一个简单的桌面程序,于是我又把MFC捡起来.MFC早已过时,不过如果开发简单的Window...
  • soliddream66
  • soliddream66
  • 2015年03月26日 13:07
  • 2013

制作一个基于MFC对话框的OpenGL类

今天写了个基于MFC对话框的OpenGL类:COpenGL,可以在对话框程序中使用OpenGL了,并且提供了全屏与非全屏转换的两个函数,很容易使用,速度快。  使用方法:在对话框上加一个Static控...
  • fxpopboy
  • fxpopboy
  • 2006年12月29日 19:21
  • 531

如何在Visual Studio项目中正确添加汇编代码 .

引用注明>> 【作者:张佩】【镜像:www.yiiyee.cn/blog】 1.      问题描述 在以往的编程经历中,本人最常使用的汇编代码是__asm {int 3}。它可以在我...
  • zlsh007
  • zlsh007
  • 2014年08月11日 17:59
  • 612

在windows7系统下解决汇编软件兼容性问题

前段时间在学习汇编语言时,由于window7 64位系统无法兼容汇编程序,会出现如下的不兼容提示窗口。 那么该如何解决这个问题呢?其中一个方法就是通过安装虚拟机来运行汇编程序...
  • u010464679
  • u010464679
  • 2014年09月26日 15:21
  • 718

MFC基于对话框的的多点触控简单画图程序

原msdn地址 https://msdn.microsoft.com/zh-cn/library/ee851785.aspx 这是基于单文档的,于是想写一个基于对话框的。遇到以下问题解决: ...
  • PepperEggFriedRice
  • PepperEggFriedRice
  • 2016年05月26日 15:32
  • 1042

汇编语言实现的贪吃蛇,不用绘图(创新)

 这是很早以前写的一个,汇编小游戏,觉得很有创新性,全部都用字符操作完成,不用切换分辨率去作图.在dos窗口下就可以玩.不过有个缺点就是在不同频率CPU的机子上会有不同的速度,这个可以靠调节延时程序,...
  • geniusdot
  • geniusdot
  • 2007年03月05日 15:22
  • 3613
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用汇编轻松地写基于对话框的程序
举报原因:
原因补充:

(最多只允许输入30个字)