ダイアログベースでOnUpdateを処理するには
MFCで簡単なプログラムを作るときはダイアログベースで作ることが多いです。しかしダイアログベースの場合Doc-Viewの時にあるON_UPDATE_UI関連のメッセージを処理することができません。これがあるとボタン類の有効/無効が簡単に処理できるのですが。
これをダイアログベースで実装する方法です。
元記事はこちら。
Dr.Dobb's | WM_KICKIDLE for Updating MFC Dialog Controls
要約するとWM_KICKIDLEを実装して、IDLE時間でダイアログコントロール達をUpdateしましょうということ。
//WM_KICKIDLEを定義してあるヘッダを読み込む
#include <afxpriv.h>//MESSAGE_MAPの定義
BEGIN_MESSAGE_MAP(CconcatDlg, CDialog)
ON_MESSAGE(WM_KICKIDLE, onkickidle)
END_MESSAGE_MAP()//関数の定義
LRESULT CconcatDlg::onkickidle(WPARAM wParam, LPARAM lParam)
{
this->UpdateDialogControls(this, true);
return FALSE;
}
そして上の例のようにonKickIdle()のなかでUpdateDialogControls()を呼ぶだけでONUPDATE_UI関連メッセージを処理できるようになる。このあとは各ダイアログコントロールのIDごとに以下のように実装していく。
//MESSAGE_MAPの定義
BEGIN_MESSAGE_MAP(CconcatDlg, CDialog)
ON_UPDATE_COMMAND_UI(IDC_BUTTON_UP ,&CconcatDlg::OnUpdateButtonUp)
END_MESSAGE_MAP()//実際の関数を実装する
void CconcatDlg::OnUpdateButtonUp(CCmdUI* pCmdUI)
{
int iSelectedItem = m_ListView.GetNextItem(-1, LVNI_SELECTED);
if(iSelectedItem <= 0)
pCmdUI->Enable(false);
else
pCmdUI->Enable(true);
}
ちなみにUpdateDialogControls(this, true);を実装した時点でメッセージマップを定義していないコントロール(ボタンなど)はDisable状態になるので注意。
//MESSAGE_MAPの定義
BEGIN_MESSAGE_MAP(CconcatDlg, CDialog)
ON_UPDATE_COMMAND_UI(IDC_BUTTON_UP ,&CconcatDlg::OnUpdateButtonUp)
END_MESSAGE_MAP()//実際の関数を実装する
void CconcatDlg::OnUpdateButtonUp(CCmdUI* pCmdUI)
{
int iSelectedItem = m_ListView.GetNextItem(-1, LVNI_SELECTED);
if(iSelectedItem <= 0)
pCmdUI->Enable(false);
else
pCmdUI->Enable(true);
}
| 固定リンク
この記事へのコメントは終了しました。

コメント