CDialogで、更新ハンドラを使用する

MFCで作成したダイアログ(CDialog派生クラス)にメニューを追加し、更新ハンドラ(OnUpdateXXX() 関数)を定義しても、メニューのポップアップの時ではなく、メニューが選択してから呼び出されてしまう。つまり、更新ハンドラの中で、
pCmdUI->Enable(FALSE);
としても、メニューが無効にはならない。

これは、MFCの CFrameWnd にてサポートされている機能だからだ。(CDialogはCFrameWndの派生クラスではない)
そこで、CFrameWnd で定義されているメニューのチェック用ハンドラを現在のダイアログクラスに追加することで、同様の機能をサポートすることが出来る。これに対処するには、WM_INITMENUPOPUP メッセージを処理する。具体的には以下のおとり。

// ダイアログのクラス定義に以下を追加
afx_msg void OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu);

// ダイアログのメッセージマップに以下を追加
ON_WM_INITMENUPOPUP()

// ダイアログに以下の関数を実装
void OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu)
{
// 長いので省略。。。
// MFCのソース(WINFRM.cpp)を参考にして下さい。
// CFrameWnd::OnInitMenuPopup() を丸ごとコピー
// 以下はエラーとなるので、コメントアウト
// AfxCancelModes(m_hWnd);
// #ifndef _AFX_NO_OLE_SUPPORT から #endif まで
// m_bAutoMenuEnable はCFrameWndのメンバなので、TRUE に置き換え
}
[PR]
by isoq | 2004-05-18 13:47 | C/C++/Win32
e87.com(千趣会イイハナ) 花を贈るなら日比谷花壇
<< モバイルはじめます!! もちろん、チャーシュー!! >>