MFCダイアログでのON_UPDATE_COMMAND_UI
MFCのダイアログでUIコントロールをEnableにしたりDisableにしたりするのに
更新ハンドラの仕組みが使えたら便利なことがよくあります。
しかし単純に以下のように更新ハンドラを記述しても OnUpdateOKButton は呼ばれません。
BEGIN_MESSAGE_MAP(CTestDlg, CDialog)
//{{AFX_MSG_MAP(CTestDlg)
ON_UPDATE_COMMAND_UI(IDOK, OnUpdateOKButton)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
void CTestDlg::OnUpdateOKButton(CCmdUI* pCmdUI)
{
pCmdUI->Enable(条件);
}
ダイアログで更新ハンドラを使うには適切なタイミングで CWnd::UpdateDialogControls を呼んでやる必要があります。
適切なタイミングとしては WM_KICKIDLE メッセージというものがあります。WM_KICKIDLE メッセージはWindowsプライベートメッセージのため標準では使えませんが、afxpriv.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)
{
// 更新ハンドラを呼び出してUIの状態を更新する
UpdateDialogControls(this, FALSE);
return FALSE;
}
void CTestDlg::OnUpdateOKButton(CCmdUI* pCmdUI)
{
pCmdUI->Enable(条件);
}
1 コメント:
OnKickIdle の return の値をFALSEに修正しました。
OnKickIdle の return でTRUEを返すと、すぐにまたWM_KICKIDLEメッセージが来て、ぐるぐると回ってCPU負荷が高くなってしまうようです。
参考:http://www.ddj.com/dept/windows/184416462
コメントを投稿