Event Callback Funktion



  • Hallo,
    habe ein TreeView Steuerelement auf einem Dialog, diesen habe ich mit dem Ressourcen Editor im Visual Studio erstellt. Jetzt wollte ich die Nachricht WM_MOUSEMOVE abfangen. Aber leider geht das nur für den Dialog aber nicht auf dem plazierten TreeView.
    Hat einer eine Idee, wie die Nachrichten des TreeView auch auf die Eltern EventCallback Funktion weitergeleitet werden kann?

    Noch was:
    Der Dialog hat nicht die MainWndProc sondern eine selbst definierte.
    Ist das der Grund dafür, dass es nicht geht?



  • nein, das ist nicht der Grund.

    Ich denke, die beste Möglichkeit wäre subclassing.
    Denn du wirst die WM_MOUSEMOVE bestimmt nicht einfach über ein Flag zum
    Parentdialog weiterreichen lassen können.

    Ein Beispiel:

    //...
    static WNDPROC g_pOldViewProc; // Das hier ist ein Zeiger auf die originale Fensterprozedur des ListViews
    //...
    LRESULT CALLBACK NewViewProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
    {
        // Das ist die neue Prozedur für das ListView
        // also machen wir unser eigenes WM_MOUSEMOVE
        switch (msg)
        {
        case WM_MOUSEMOVE:
            {
                // irgendwie auf die Nachricht reagieren
                // in diesem Beispiel geben wir sie einfach an den Dialog weiter
                // ACHTUNG: die übergebenen Mauskoordinaten werden nun nicht mehr stimmen,
                // da diese relavtiv zum Fenster (in dem Falle zum ListView) sind.
                // Man müsste also die Mauskoordinaten eigentlich erst noch umrechnen, das spare ich mir jetzt aber
                return SendMessage(GetParent(hWnd), msg, wParam, lParam);
            } break;
        }
        // Den Rest lassen wir wie er war, also rufen wir die originale Fensterprozedur auf
        return CallWindowProc(g_pOldViewProc, hWnd, msg, wParam, lParam);
    }
    
    //...
    
    // Jetzt muss das ListView nur gesagt bekommen, dass es eine neue Fensterprozedur hat.
    // Also am besten gleich nach dem erstellen (im Dialog also bei WM_INITDIALOG)
        case WM_INITDIALOG:
            {
                // ...
                g_pOldViewProc = (WNDPROC)SetWindowLong(hWnd, GWL_WNDPROC, (LONG)NewViewProc);
                // Wenn das ganze auch für 64 Bit System funktionieren soll, so:
                // g_pOldViewProc = (WNDPROC)SetWindowLongPtr(hWnd, GWLP_WNDPROC, (LONG_PTR)NewViewProc);
                // ...
            } break;
    // das wärs auch schon.
    

    auf diese Weise würdest du eine WM_MOUSEMOVE automatisch an deinen Dialog weiterleiten.
    Um die richtigen Mauskoordinaten musst du dich natürlich noch kümmern.

    Natürlich kannst du jetzt auch schon alles innerhalb der gesubclassten WndProc (NewViewProc) erledigen.

    MfG DrakoXP


Anmelden zum Antworten