エディットコントロールに入力後,値をチェックしたいなんてことはよくある話です.
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;
}
参照