Last Updated 2003/01/09
Programming Tips Visual C++ MFC CEdit  索 引 
エディットコントロールのキルフォーカス(入力チェック)
2003/01/09

エディットコントロールに入力後,値をチェックしたいなんてことはよくある話です.
OnKillFocus() でチェックしようとなるとダイアログのキャンセルボタンを判断しなくてはならない.
エラーがあれば再びエディットコントロールに SetFocus するでしょう.
(チェックしてなにもしないのであれば入力後のキルフォーカスでチェックする必要はない)

しかし,エディットコントロールが EN_KILLFOCUS を受け取った時には,キャンセルボタンのクリックなのかは分からない.

以下のようにするとキャンセルボタンのクリック判断が可能である.

  protected:
    BOOL bKillInputFocus;
    BOOL BadInputPrompt();
    virtual void OnOK();
    afx_msg void OnSetFocusCtrl();
    afx_msg void OnKillFocus();

  MESSAGE_MAP マクロに追加
    ON_EN_KILLFOCUS(IDC_EDIT, OnKillFocus)
    ON_EN_SETFOCUS(IDC_EDIT, OnSetFocusCtrl)
    ON_EN_SETFOCUS(IDC_EDIT, OnSetFocusCtrl)

BOOL CHogeDialog::BadInputPrompt()
{
    UpdateData();
    BOOL bBad = bKillInputFocus && 入力チェック不可なら TRUE;
    bKillInputFocus = FALSE;
    if( bBad ) {
        AfxMessageBox( "エラー" );
        PostMessage(WM_NEXTDLGCTL, (WPARAM)::GetDlgItem(m_hWnd, IDC_EDIT), 1L);
    }
    return bBad;
}

void CHogeDialog::OnSetFocusCtrl()
{
    BadInputPrompt();
}

void CHogeDialog::OnOK()
{
    if( !BadInputPrompt() ) {
        CDialog::OnOK();
    }
}

void OnKillFocus()
{
    bKillInputFocus = TRUE;
}


参照
前後のTips
エディットコントロールのキルフォーカス(入力チェック)

DSS ProgrammingTipsCGI Ver2.01