Question

J'ai une classe dérivée de CWnd qui a un gestionnaire de WM_CONTEXTMENU (de OnContextMenu), qui a mon menu contextuel par défaut. Cette classe est utilisée à plusieurs endroits dans ma demande.

Certains des endroits où il est utilisé également en charge la WM_CONTEXTMENU au niveau des parents (la mère de la fenêtre). Ils remplacent essentiellement le menu contextuel par défaut.

Quand je suis dans la classe dérivée de CWnd, je veux essentiellement savoir si quelqu'un d'autre (un parent de la fenêtre) a traité le menu contextuel.

par exemple:

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

Il est possible via le cadre Win32 / MFC?

Était-ce utile?

La solution

J'ai trouvé un moyen de découvrir si quelque chose est arrivé au cours de la mise en œuvre du gestionnaire par défaut. Il ne peut pas être la solution la plus élégante, mais ici il est:

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
        // ...
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top