0

デフォルトのコンテキストメニューを持つハンドラー( )を持つCWnd派生クラスがあります。このクラスは、私のアプリケーションのいくつかの場所で使用されています。 WM_CONTEXTMENUOnContextMenu

それが使用されている場所のいくつかはWM_CONTEXTMENU、親レベル(ウィンドウの親)でも処理します。基本的に、デフォルトのコンテキストメニューを上書きします。

派生クラス内にいるときはCWnd、基本的に、他の誰か(ウィンドウの親)がコンテキストメニューを処理したかどうかを知りたいです。

例えば:

void MyDerivedWnd::OnContextMenu( CWnd* in_pWnd, CPoint in_point )
{
    LRESULT res = __super::Default();

    // Now, how to I know of something happened inside __super::Default();??

    // Show my default menu
    // ...
}

Win32 / MFCフレームワークを介して可能ですか?

4

1 に答える 1

0

デフォルトのハンドラーの実装中に何かが起こったかどうかを発見する方法を見つけました。これは最も洗練されたソリューションではないかもしれませんが、ここにあります:

bool g_bWindowCreated = false;
HHOOK g_hHook = NULL;
LRESULT CALLBACK HookProc(int code, WPARAM wParam, LPARAM lParam)
{
    if( code == HCBT_CREATEWND )
        g_bWindowCreated = true;

    return CallNextHookEx( g_hHook, code, wParam, lParam );
}

void MyDerivedWnd::OnContextMenu( CWnd* in_pWnd, CPoint in_point )
{
    // Setup a hook to know if a window was created during the 
    // Default WM_CONTEXT_MENU handler
    g_bWindowCreated = false;
    g_hHook = SetWindowsHookEx( WH_CBT, HookProc, NULL,  GetCurrentThreadId() );

    // Call the default handler
    LRESULT res = __super::Default();

    UnhookWindowsHookEx( g_hHook );

    if( !g_bWindowCreated )
    {
        // Show my default menu
        // ...
    }
}
于 2010-10-26T14:15:51.883 に答える