欢迎访问:常州市武进区嘉泽中心小学网站 !今天是:
栏目列表
您现在的位置是:首页>>教师>>计算机技术>>程序设计>>杂项>>文章内容
CPropertyPage检测数据有效性后避免自动关闭
发布时间:2008-11-20   点击:   来源:本站原创   录入者:佚名
 

今天用CPropertyPage的派生类接收用户输入的数据.

class CMovieIssueBasicPage : public CPropertyPage

在用户点"确定"的时候, 首先要检测数据是否有效, 然后再决定是否进行下一步操作. 一旦数据不符合标准, 要求用户重新输入. 这就要让属性页在数据无效的时候不能自动关闭.

习惯性地重载了OnOK虚函数

void CMovieIssueBasicPage::OnOK()
{

       if(IsDataAvailably())
              CPropertyPage::OnOK();

}

却发现, 无论IsDataAvailably()函数返回TRUE还是FALSE, 无论CPropertyPage::OnOK();是否被执行到了,属性页都执着地要自动关闭.

难道就不能干预了么?

先看看CPropertyPage::OnOK();前后都干了些什么.

在void CMovieIssueBasicPage::OnOK() 内部设置断点,然后开始调试.

执行到OnOK()的时候, 看Call Stack:

CMovieIssueBasicPage::OnOK() line 137
CPropertyPage::OnApply() line 302
CMovieIssueBasicPage::OnApply() line 337

显然OnOK之前先执行了OnApply(), OnApply里面又干了些什么呢? go to code:

BOOL CPropertyPage::OnApply()
{
 ASSERT_VALID(this);

 OnOK();
 return TRUE;
}

很显然, MFC的属性页默认是通过OnApply调用OnOK的, 那么重载OnApply函数, 通过该函数的返回值就可以决定属性页是否自动关闭了.

最终, 代码写成这样:

BOOL CMovieIssueBasicPage::OnApply()
{

       if(!IsDataAvailably())
              return FALSE;

       return TRUE;

}
--------------------------------------

要想了解函数调用的前前后后, 看Call Stack尤为重要.


附件:
    关闭窗口
    打印文档
    账号登录
    保持登录 忘记密码?
    账号与武进教师培训平台同步