对话框分为模态对话框和非模态对话框。模态对话框是指只有其销毁后,才能对其父窗口
进行操作的对话框;而非模态则无此要求。本博文将会介绍下模态对话框的资源定义与使
用。
一、基本知识
对话框主要是用来进行和用户交互的,其存在可以使得主窗口更加简洁。对话框也是基于
窗口的。但Windows的封装使得建立对话框比建立窗口简单的多。
下面看看建立窗口、模态对话框与非模态对话框的异同:
从上图可以发现以下几点:
1、建立对话框无需注册类,不用调用建立、显示和刷新窗口的函数了。
2、普通窗口和非模态对话框要自定义消息循环,而模态对话框则不需要了。
3、对话框对对话框过程的调用更加间接了。
4、建立模态对话的函数是DialogBoxParam,建立非模态对话框的函数是CreateDialogParam。
二、定义资源与使用对话框
从上图中可以明显的看出建立对话框只要调用DialogBoxParam。另外,对要特殊处理的消息也
要在自定义的对话框过程中处理。
是像上面说的那样吗?是的,但不足以用来编程!
接着看:
首先,对话框是作为一种资源存在在的。所以,得在资源文件内定义对话框。这就相当于定义了
对话框的模版,并且,模态与非模态对话框的资源定义无差别。差别在于建立时调用不同的函数。
其次,根据上图可以看到建立模态对话框,Windows内部为我们建立了内建消息循环、内建窗口
过程。我们在调用DialogBoxParam时,这个函数直到对话框的销毁才会返回。另外,在调用时
也指定了资源文件中的对话框模版,Windows根据模版建立对话框。这里也不需要我们关心。
;建立模态对话框,一直到对话框销毁函数才返回
;DLG_MAIN就是资源文件中的对话框
invoke DialogBoxParam,hInstance,DLG_MAIN,\
NULL,offset _ProcDlgMain,NULL
(1)、对话框资源定义
1、
对话框ID dialog [ discardable ] x坐标,y坐标,宽度,高度
[ 可选属性 ]
begin
子窗口控件
end
其中,可选属性只要有标题文字、窗口风格、字体等;而子窗口控件包括图标、按钮等。
2、实例
#include <resource.h>
#define ICO_MAIN 0x1000
#define DLG_MAIN 1
//定义图标
ICO_MAIN icon discardable "Main.ico"
//定义对话框
DLG_MAIN dialog discardable 50,50,113,63
//对话框属性定义
style WS_VISIBLE | WS_CAPTION | DS_MODALFRAME | WS_SYSMENU
caption "Dialog"
font 9,"宋体"
//子窗口控件定义
BEGIN
icon ICO_MAIN,-1,10,11,18,21
ctext "Dialog example\nby lulipeng",-1,36,14,70,19
defpushbutton "Exit(&X)",IDOK,58,46,50,14
control "",-1,"Static",SS_ETCHEDHORZ | WS_CHILD | WS_VISIBLE,6,39,103,1
END
(2)、使用
1、在DialogBoxParam函数的参数中指定资源即可。
2、实例
.386
.model flat,stdcall
option casemap:none
include windows.inc
include user32.inc
includelib user32.lib
include kernel32.inc
includelib kernel32.lib
ICO_MAIN equ 1000h
DLG_MAIN equ 1
.data?
hInstance dd ?
.code
_ProcDlgMain proc uses ebx edi esi hWnd,uMsg,wParam,lParam
mov eax,uMsg
.if eax == WM_CLOSE
;对话框要用EndDialog销毁
invoke EndDialog,hWnd,NULL
.elseif eax == WM_INITDIALOG
;设置图标
invoke LoadIcon,hInstance,ICO_MAIN
invoke SendMessage,hWnd,WM_SETICON,ICON_SMALL,eax
.elseif eax == WM_COMMAND
mov eax,wParam
.if ax == IDOK
invoke EndDialog,hWnd,NULL
.endif
.else
;自定义的对话框过程没有处理消息,要向
;对话框管理器返回FALSE,否则返回TRUE
mov eax,FALSE
ret
.endif
mov eax,TRUE
ret
_ProcDlgMain endp
start:
invoke GetModuleHandle,NULL
mov hInstance,eax
;建立模态对话框,一直到对话框销毁函数才返回
;DLG_MAIN就是资源文件中的对话框
invoke DialogBoxParam,hInstance,DLG_MAIN,\
NULL,offset _ProcDlgMain,NULL
invoke ExitProcess,NULL
end start
三、代码中图标 "Main.ico" 下载
Main.ico
四、代码运行结果