MFC对话框和属性表

时间:2023-06-18 10:40:26

对话框主要有两类,分为模式和无模式,它们的功能都被封装在了CDialog中。与对话框相近的是属性表,属性表实际上是具有制表页(TAB 页)的对话框,将对话框中控件更好的组织在一起。借助CpropertySheet和CpropertyPage类,MFC简化了属性表的处理。

模式对话框和无模式对话框

一般来说模式对话框的创建包括3步:1、创建一个对话框模板;2、实例化该模板得到一个对象;3、调用Cdialog::DoModal函数来显示对话框。

无模式对话框和模式对话框有很多相同点,两者主要的区别在于:

1、  显示无模式对话框需要调用Cdialog::Create函数而模式对话框调用Cdialog::DoModal函数。DoModal函数会等到对话框被清除后才返回,而Create等到对话框建立完成后就会返回。

2、  清除无模式的对话框需要调用DestroyWindow而不是EndDialog,禁止无模式对话框调用OnOK和OnCancel函数,因为这两个函数都会调用EndDialog函数。

3、  模式对话框通常在栈上实例化,所以析构是自动实现的。而无模式对话框通过new实例化,所以该对象不会过早地被清除,如果要确保清除对话框删除无模式对话框对象,一种方法是在派生的对话框类中覆盖Cdialog::PostNcDestroy并执行delete this。

属性表

属性表示包含控件也的标签式对话框,用户可通过单击鼠标在其间切换。属性表的功能都合理地封装在一对MFC类----CpropertySheet和CpropertyPage中。CpropertySheet代表属性表本身,从Cwnd派生而来;CpropertyPage代表属性表中的页,是从Cdialog中派生而来的。和对话框一样,属性表可以是模式和无模式的。

创建属性表的步骤如下:

1、  针对属性表的每一页创建一个对话框模板,定义页的内容和特性。将对话框标题设置成您希望在属性表页上方标签中显现的标题。

2、  针对属性表的每一页由CpropertyPage派生出一个类似对话框的类。

3、  由CpropertySheet派生出衣蛾属性表类,将该类和步骤2中得到的属性表页实例化,利用CpropertySheet::AddPage将各页按期望中的显示顺序添加到属性表中。

4、  调用属性表的DoModal函数将属性表显示在屏幕上。

通常情况下,我们会利用DDX和DDV实现控件和属性表页数据成员间的数据传输,因为这可以将属性表处理中许多困难的工作交给MFC去做。通过覆盖页的OnInitDialog、OnSetActive、OnKillActive、OnOK和OnCancel函数并执行特有的处理过程,您可以定义属性表的操作,但是一定要调用基类中的等价函数,否则,主结构不能工作。