第四篇 对话框的建立与使用

对话框分为模态对话框和非模态对话框。模态对话框是指只有其销毁后,才能对其父窗口

进行操作的对话框;而非模态则无此要求。本博文将会介绍下模态对话框的资源定义与使

用。

 

一、基本知识

对话框主要是用来进行和用户交互的,其存在可以使得主窗口更加简洁。对话框也是基于

窗口的。但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

 

四、代码运行结果

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值