2006年04月13日

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)
{
  UpdateDialogControls(this, FALSE); // 更新ハンドラを呼び出してUIの状態を更新する
  return FALSE;
}

void CTestDlg::OnUpdateOKButton(CCmdUI* pCmdUI)
{
  pCmdUI->Enable(条件);
}


Posted by Akihiro at 14:45 | Comments (1)