我在一个PropertySheet中放了几个PropertyPage,每个都会有一些输入框。现在我希望当用户用鼠标或键盘在这几个Page间切换时,首先检查输入是否正确,如果不正确则提示用户,并仍保留当前Page为选择状态。如何做?

解决方案 »

  1.   

    这个东西我没做过,不过我提个思路供你参考一下(不一定正确啊):在SHEET中截获改变当前页的消息,判断当前页的输入是否正确,若正确则SET当前页为所选页。若不正确则SET当前页仍为输入数据的这页。
      

  2.   

    如果有ddv,显式调用updatedata(FALSE),即可。
      

  3.   

    我现在的问题就是找不到这么一个事件(或者是处理这样事件的Handler也行啊)。我倒是查到有一个PSM_SETCURSEL事件用于切换Page,但似乎是给程序员用用程序切换Page用的,而用鼠标做这件事时并没有发这个事件(我没有捕捉到)。我想自己发一个PSM_SETCURSEL事件,然后跟踪找出哪一个Handler做这件事,但最后跟到了汇编。真是没办法啊!
      

  4.   

    To: ironsmith(三无人员)
    能否具体说说。在何处调用updatedata(FALSE)?
      

  5.   

    有一个SetActivePage你跟踪一下吧,看看之前是怎么调用这个函数。
      

  6.   

    另外我觉得ironsmith(三无人员)说的跟我是同一个意思。
      

  7.   

    是不是CPropertyPage::OnSetActive这个函数跟踪一下,
      

  8.   

    如果有ddv,显式调用updatedata(FALSE),即可。
      

  9.   

    Sorry, 重载 CPropertyPage::OnKillActive()在其中做检测,注意UpdateData调用顺序,事实上,CPropertyPage::OnKillActive()可能调用UpdateData(false),但你可以提前再调一次。
      

  10.   

    1  重载CPropertySheet类的OnCmdMsg函数2  你可以扩展下面的代码如:UpdateData(你的Page)页再取该页面的值如没有得到则按return FALSE返回 
    int iPage = GetActiveIndex( );
    if(((iPage == 0) && (nID == NEXT)) || ((iPage == 2) && (nID == BACK)) )
    {
    SetWizardButtons(PSWIZB_BACK | PSWIZB_NEXT);
    }
    else if(iPage == 1)
    {
    if (nID == NEXT)
    SetWizardButtons(PSWIZB_BACK | PSWIZB_FINISH);
    else if (nID == BACK)
    SetWizardButtons(PSWIZB_NEXT);
    }
      

  11.   

    补充NEXT及BACK 是nID参数的常数变量
      

  12.   

    对不起,笔误,我上贴应是UpdateData(true); or UpdateData()不应为UpdateData(false);可能是受了“我来也”的误导的原因,向楼主道歉
      

  13.   

    多谢各位,我试了一下,用重载CPropertyPage::OnKillActive的方法可以达到我的目的。
    散分!!
      

  14.   

    // Validate the value entered to the Number edit control. Its
    // value must be at least one. If not, tell the user and set the
    // focus to the Number edit control. CStylePage is a 
    // CPropertyPage-derived class.
    BOOL CStylePage::OnKillActive() 
    {
      int num = GetDlgItemInt(IDC_NUMOBJECTS);
      if (num <= 0)
      {
        AfxMessageBox("Number of objects must be at least 1.");
        CEdit* edit = (CEdit*) GetDlgItem(IDC_NUMOBJECTS);
        edit->SetFocus();
        edit->SetSel(0, -1);
        return 0;
      }  return CPropertyPage::OnKillActive();
    }