今天用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尤为重要.