对话框分为模态对话框和非模态对话框。模态对话框是指只有其销毁后,才能对其父窗口
进行操作的对话框;而非模态则无此要求。本博文将会介绍下模态对话框的资源定义与使
用。
一、基本知识
对话框主要是用来进行和用户交互的,其存在可以使得主窗口更加简洁。对话框也是基于
窗口的。但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
四、代码运行结果