ダイアログのコントロールでON_UPDATE_COMMAND_UIを使う

ダイアログのUIコントロールは、そのままではON_UPDATE_COMMAND_UIメッセージが飛ばない。
意図的にCWnd::UpdateDialogControls()をコールしてメッセージを飛ばしてやる必要がある。
メッセージを飛ばすタイミングとして、WM_KICKIDLEを使うのが良い。
WM_KICKIDLEはWindowsプライベートメッセージのため通常では使えないが、afxpriv.hをインクルードする事で使えるようになる。

  • CTestDlg.h
Class CTestDlg : public CDialog
{
public:
  afx_msg LRESULT OnKickIdle(WPARAM wParam, LPARAM lParam);
  afx_msg void OnUpdateOKButton(CCmdUI* pCmdUI);
}

  • CTestDlg.cpp
#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