« Windows Live Writerでココログを更新する | トップページ | Thinkpad T60でCDRecordを使うには »

ダイアログベースで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);
}

|

« Windows Live Writerでココログを更新する | トップページ | Thinkpad T60でCDRecordを使うには »

パソコン・インターネット」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/2371/16181709

この記事へのトラックバック一覧です: ダイアログベースでOnUpdateを処理するには:

« Windows Live Writerでココログを更新する | トップページ | Thinkpad T60でCDRecordを使うには »