ダイアログのUIコントロールは、そのままではON_UPDATE_COMMAND_UIメッセージが飛ばない。
意図的にCWnd::UpdateDialogControls()をコールしてメッセージを飛ばしてやる必要がある。
メッセージを飛ばすタイミングとして、WM_KICKIDLEを使うのが良い。
WM_KICKIDLEは
Windowsプライベートメッセージのため通常では使えないが、afxpriv.hをインクルードする事で使えるようになる。
Class CTestDlg : public CDialog
{
public:
afx_msg LRESULT OnKickIdle(WPARAM wParam, LPARAM lParam);
afx_msg void OnUpdateOKButton(CCmdUI* pCmdUI);
}
#include "stdafx.h"
#include "CTestDlg.h"
#include <afxpriv.h>
BEGIN_MESSAGE_MAP(CTestDlg, CDialog)
//{{AFX_MSG_MAP(CTestDlg)
ON_MESSAGE(WM_KICKIDLE, OnKickIdle)
ON_UPDATE_COMMAND_UI(IDOK, OnUpdateOKButton)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
LRESULT CTestDlg::OnKickIdle(WPARAM wParam, LPARAM lParam)
{
UpdateDialogControls(this, FALSE); // 更新ハンドラを呼び出してUIの状態を更新する
return FALSE;
}
void CTestDlg::OnUpdateOKButton(CCmdUI* pCmdUI)
{
pCmdUI->Enable(TRUE);
}
最終更新:2011年09月27日 17:13