2012-01-24 20 views
1

CFrameWndExメインフレームウィンドウに基づいて、VS2008(およびVS2010)SDIプロジェクトでWM_MENUSELECTメッセージを処理しようとしています。CFrameWndExウィンドウでWM_MENUSELECTが処理されない

私のようなものになりVS2008ウィザード(単一の文書、「MFCの標準」、オプションの「古典的なメニューを使用」)から、単純なプロジェクト(後WM_MENUSELECTメッセージを追加しました)作成:

class CMainFrame : public CFrameWnd 
{ 
///... 
public: 
    afx_msg void OnMenuSelect(UINT nItemID, UINT nFlags, HMENU hSysMenu); 
}; 

をし、

IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd) 

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) 
    ON_WM_CREATE() 
    ON_WM_MENUSELECT() 
END_MESSAGE_MAP() 

///... 
void CMainFrame::OnMenuSelect(UINT nItemID, UINT nFlags, HMENU hSysMenu) 
{ 
    CFrameWnd::OnMenuSelect(nItemID, nFlags, hSysMenu); 
} 

のCMainFrameにブレークポイントを入れたときにこれは、作品::メニューは(毎回その場合)を使用した場合、それがトリガされOnMenuSelect

交換

class CMainFrame : public CFrameWndEx 
{ 
///.... 
public: 
    afx_msg void OnMenuSelect(UINT nItemID, UINT nFlags, HMENU hSysMenu); 
}; 

IMPLEMENT_DYNCREATE(CMainFrame, CFrameWndEx) 

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWndEx) 
    ON_WM_CREATE() 
    ON_WM_MENUSELECT() 
END_MESSAGE_MAP() 

///....  
void CMainFrame::OnMenuSelect(UINT nItemID, UINT nFlags, HMENU hSysMenu) 
{ 
    CFrameWndEx::OnMenuSelect(nItemID, nFlags, hSysMenu); 
} 

メッセージを(、オプションの「メニューバーを使用して、ツールバー」またはオプションの単一の文書、「MFCの標準」でウィザードを使用して新しいプロジェクトを作成することによって)CFrameWndExによってCFrameWndの決して誘発されません。

私はCFrameWndExを使用してプロジェクトを厳密に最小限に抑えていますが、メッセージを受け取ることはできません。

理由は何ですか?ヒントはいつでも歓迎します。おかげさまで

答えて

1

Aaah、MFCのソースコードへのシングルステッピングの良い時代!常にキーとなりました;-)

CMFCPopupMenu::SetSendMenuSelectMsg()はあなたの新しい友達です。

ちょうどあなたのCMainFrame::OnCreate()にこの行を追加します。

CMFCPopupMenu::SetSendMenuSelectMsg(TRUE); 

一番下の行は、MFCのメニューとツールバーは、標準のWindowsオブジェクトの周りにいつものラッパーではないということです。彼らは、異なるモデルを使用して、物事を別々に実装します。

下位互換性を保つために、これらのクラスに先行操作を依頼してデフォルトでは行わないWM_MENUSELECTを送信することができます。

注:おそらく、これらのオブジェクトを操作するための新しい仕組みやベストプラクティスがあります。互換性設定を強制するのではなく、それらを調査する価値があります。

2

基本クラスは、メッセージマップの先頭(ON_WM_MENUSELECT以上)のマクロで正しくなければなりません。私の推測では、基本クラスを変更したときにそれをCFrameWndExに変更していないということです。

+0

いいえ、クラスは正しいです(私は主な質問を編集します)。 – Max

関連する問題