Как узнать, обрабатывал ли кто-то еще OnContextMenu - PullRequest
0 голосов
/ 25 октября 2010

У меня есть производный класс 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?

1 Ответ

0 голосов
/ 26 октября 2010

Я нашел способ выяснить, произошло ли что-то во время реализации обработчика по умолчанию. Возможно, это не самое элегантное решение, но вот оно:

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
        // ...
    }
}
...