Fensterklassen



  • SetClassLong ... aber das verändert eben auch die MsgProc eines schon erstellten Fensters mit der Klasse.

    Ich kann mir zwar auch nicht vorstellen, dass du 100 WndKlassen brauchst, aber im Notfall würde Windows das schon aushalten 😉

    M.T.



  • Hm... ihtr glaubt mirs nicht?

    Ich habe eine Instanzen von der Klasse, in denen verschiedene Daten gespeichert sind und die in den Fenstern die zur Klasse gehören ausgegeben werden. Wenn ich jetzt für alle Fenster dieselbe Windowproc habe, dann kriege ich ja nur das Fenster, welches zB WM_PAINT erhält und nicht die dazugehörige Instanz der Klasse, von der ich die Daten holen muss.
    Ich wollte es eben so machen, dass WindowProc der Fenster in der Klasse selber definiert ist.

    SetClassLong werde ich mir mal anschauen...



  • Du brauchst also 'ne Zuordnung HWND - Instanz?

    die meisten Frameworks (u.a. ATL und MFC) verwenden dafür eine map<HWND, Instance *>. Hat den Vorteil, das vom Windows "nix weiter" braucht.
    Alle Fenster bekommen dann eine globale WNDPROC, die einfach in der map nachschaut und dann die message an eine entsprechende Memberfunktion der Instanz weiterleitet.

    Für die meisten Fenster kann man mit SetWindowLong sich einen Instanz-Zeiger selbst speichern. Ist aber verschieden z.B. für Dialog-Klassen, und generell nicht so portabel wie obige Lösung.



  • Hm... so muss ichs wohl machen, weil C++ anscheinend sowieso keine Funktionszeiger auf Memberfunktionen akzeptiert...
    Schade, hätte so schön einfach werden können 🙂

    Aber naja, nen bissel Übung hat ja noch nie geschadet.

    Gruß, Maxi



  • C++ anscheinend sowieso keine Funktionszeiger auf Memberfunktionen akzeptiert

    Tut's schon - nur brauchst du dann trotzdem 'ne Instanz dazu 😉



  • Das versteh ich jetzt nicht...

    wie meinst du das?





  • Meinst du das hier? 🙂



  • Maxi2 schrieb:

    Gibt es nicht eine Möglichkeit die selbe Fensterklasse zu nutzen, nur eben andere WindowProcs zu nehemn, oder sie nachträglich zu ändern?

    Jawohl, gibt es. SChlüsselwort: SubClassing!

    In die WindowProc der Klasse schreibst du den Code, der für jedes der Fenster ausgeführt werden soll. Nach dem Kreieren eines jeden Fensters rufst du SetWindowLongPtr() mit GWL_WNDPROC auf, um dem Fenster eine neue WindowProc zu geben. Am Ende dieser WindowProc schreibst du

    return CallWindowProc(DefWndPrc, hwnd, uiMsg, wParam, lParam);
    

    wobei "DefWndProc" die WindowProc der Klasse ist.

    P.S. Und wenn du das ganze noch in einer C++ - Klasse kapseln willst (was du hier schon sagen solltest), benutzt du flenders' Link.



  • Schlüsselwort hört sich etwas verwirrend an. 😃



  • Hm... das hört sich alles so kompliziert an, irgnedwie, das mit der map<HWND, Instanz_die_HWND_braucht*) schi3nt doch etwas einfacher zu sein, ich habs mir heute im Schulbus überlegt, und da müsste ich es eigentlich auch so klappen, aber vl probier ich das anderre ja auch mal aus 🙂

    Gruß, Maxi


Anmelden zum Antworten