0

我有一个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 框架吗?

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 回答