用户操作
[留言]  [发消息]  [加为好友] 
订阅我的博客
XML聚合    FeedSky
订阅到鲜果
订阅到Google
订阅到抓虾
111222的公告
<a href=http://easeso.com>逸搜 - 文件轻松搜!</a> <Form action="http://easeso.com:8080/search" name=f><INPUT maxLength=256 name=key size=34 class=edit title="输入歌名、歌手名,游戏、软件名后点搜索" onMouseOver=this.focus(); onFocus=this.select();> <Input type=submit class=button value="EaseSo文件搜索" title="输入关键词按回车就可以了"><BR> <span id=fmt><INPUT type=radio CHECKED value="" name=ty>所有格式<INPUT type=radio value=mp3 name=ty>MP3<INPUT type=radio value=rm name=ty>RM<INPUT type=radio value=exe name=ty>EXE<INPUT type=radio value=zip name=ty>ZIP<INPUT type=radio value=jpg name=ty>JPG<INPUT type=radio value=swf name=ty>SWF</FONT></span></FORM><a href=http://111222.cn>MP3音乐猎手</a>
文章分类
    分类?什么东西
    存档

    原创  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尤为重要.

    发表于 @ 2004年09月07日 01:04:00 | 评论( loading... ) | 编辑| 举报| 收藏

    旧一篇:你就是那个房客 | 新一篇:#pragma setlocale("chs")

    • 发表评论
    • 评论内容:
    •  
    Copyright © 111222
    Powered by CSDN Blog