VC++ MFC属性表对话框的运行机制

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

VC++ MFC属性表对话框的运行机制

2008-07-01 19:09

属性表对话框的初始化包括框架对话框的初始化和页的初始化。页的初始化工作可在OnInitDialog函数中进行,而框架对话框的初始化应该在OnCreate函数中完成。

根据CPropertySheet::DoModal返回的是IDOK还是IDCANCEL,程序可以判断出关闭对话框时按的是OK还是Cancel按钮,这与普通对话框是一样的。

如果属性表对话框是模态对话框,在其底部会有3个按钮,依次为OK、Cancel 和Apply(应用)按钮,如果对话框是非模态的,则没有这些按钮。OK与Cancel 按钮的意义与普通按钮没什么两样,Apply按钮则是属性表对话框所特有的。普通的模态对话框只有在用户按下了OK按钮返回后,对话框的设置才能生效,而设计Apply的意图是让用户能在不关闭对话框的情况下使对话框的设置立即生效。由此可见,Apply按钮的作用是使用户在设置完数据后,不必退出对话框,就可以反复进行设置,这在许多应用场合下是很有用的。

为了对上述3个按钮作出响应,CPropertyPage类提供了OnOK,OnCancel和OnApply函数,用户可覆盖这3个函数以完成所需的工作。需要指出的是这3个函数并不是直接响应按钮的BN_CLICKED消息的,但在按钮按下后它们是被间接调用。这些函数的说明如下:

1. Virtual void OnOK( ):在按下OK或Apply按钮后,该函数被调用。默认的OnOK函数几乎什么也不干,像数据交换和关闭对话框这样的工作是在别的地方完成的,这与普通对话框的OnOK函数是不同的:

2. Virtual void OnCancel( ):在按下Cancel按钮后,该函数将被调用。默认的OnCancel函数也是几乎什么也不干;

3. Virtual BOOL OnApply( ):在按下OK或Apply按钮后,该函数将被调用。默认的OnApply 会调用OnOK函数。函数的返回值如果是TRUE,则对话框中的设置将生效,否则无效。

令人不解的是,MFC并未考虑CPropertySheet类的按钮响应问题,不要指望能通过ClassWizard来自动创建按钮的BN_CLICKED消息处理函数,通常的按钮响应都是在CPropertyPage类完成的。

下面几个CPropertyPage类的成员函数也与属性表的运行机制相关。

Void SetModified( BOOL bChanged = TRUE ):该函数用来设置修改标志。若参数bChanged为True,则表明对话框中的设置已改动,否则说明设置未改动。该函数的一个主要用途是允许或禁止Apply按钮。在默认情况下,Apply按钮是禁止的。只要一调用SetModified(TRUE),Apply按钮就被允许,而调用SetModified(FALSE)并不一定能使Apply按钮禁止,只有在所有被标为改动的页

都调用了SetModified(FALSE)后,Apply按钮才会被禁止。另外,该函数对OnApply的调用也有影响,当Apply按钮被按下后,只有那些被标记为改动过的页的OnApply函数才会被调用。在调用该函数之前,程序需要叛断页中的内容是否已被修改,可通通过处理诸如BN_CLICKED、EN_CHANGE这样的控件消息来感知页的内容的改变;

Virtual BOOL OnSetActive():当页被激活或被创建时,都会调用该函数。该函数的默认行为是如果页还未创建,就创建之,若页已经创建,则将其激活,并调用UpdateData(FALSE)更新控件。用户可覆盖该函数完成一些刷新方面的工作;

Virtual BOOL OnKillActive():当原来可见的页被覆盖或被删除时,都会调用该函数。该函数的默认行为是调用UpdateData(TRUE)更新数据。用户可覆盖该函数完成一些特殊数据的有效性检查工作。

需要说明的,属性表对话框中的所有页在一次运行中不一定都会被创建。实际上,那些从未打开过的页及其控件是不会被创建的。因此,在CPropertyPage类的派生类中,只有确定页已存在后,才能调用与对话框及控件相关的函数。如果收到控年通知消息,或OnSetActive函数被调用,则说明页已经存在。正是由于上述原因,使得属性表对话框的内数据交换只能在OnSetActive和OnKillActive函数中进行。

相关文档
最新文档