質問

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

親レベル(ウィンドウの親)で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フレームワークを介して可能でしょうか?

役に立ちましたか?

解決

何かがデフォルトのハンドラ実装の際に起こった場合は、

私は発見する方法を見つけました。これは、最もエレガントな解決策ではないかもしれないが、ここでは、次のとおりです。

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
        // ...
    }
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top