119电脑网

当前位置: 主页 > Visual C++/MFC >

CPropertyPage检测数据有效性后避免自动关闭

时间:2013-09-17 18:36来源: 作者: 点击:
今天用CPropertyPage的派生类接收用户输入的数据.class CMovieIssueBasicPage : public CPropertyPage在用户点

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

扩展阅读:用Excel制作自动记录的考勤表

选中表中的所有数据单元格,单击右键选择“复制”,点选“编辑→选择性粘贴”菜单项,在“选择性粘贴”对话框中选中“数值”项,然后单击“确定”。 五、统计结果 1.在日期行之后的单元格中依次输入“迟到”、“早退”、“病假”、“事假”等需要统计的项目。

(责任编辑:admin)
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
推荐内容