Frage

Ich habe eine CWnd abgeleitete Klasse, die einen WM_CONTEXTMENU Handler (OnContextMenu) hat, die mein Standardkontextmenü hat. Diese Klasse wird an mehreren Stellen in meiner Anwendung verwendet.

Einige der Orte, wo es auch die WM_CONTEXTMENU auf der übergeordneten Ebene behandelt verwendet werden wird (das übergeordnete Fenster). Sie haben Vorrang vor grundsätzlich das Standardkontextmenü.

Als ich in der CWnd abgeleiteten Klasse bin, mag ich im Grunde wissen, ob jemand anderes (ein Fenster Eltern) das Kontextmenü behandelt.

Beispiel:

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

Es ist möglich, über das Win32 / MFC-Framework?

War es hilfreich?

Lösung

Ich fand einen Weg, um herauszufinden, ob etwas während der Standard-Handler Implementierung passiert ist. Es ist vielleicht nicht die eleganteste Lösung, aber hier ist es:

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
        // ...
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top