WindowsProc in Class
-
Hallo,
ich muss nochmal das Thema aufgreifen, eine Procedur in eine Klasse zu bekommen, das in der FAQ schon einmal behandelt wurde.
Doch so wie ich es sehe, kann dort nicht direkt der this Pointer einer Klasse im den Userdata (SetWindowLong/PT) eines Fensters gespeichert werden.
bisher habe ich eine Klasse die Methoden und Variablen hat und eine globale FensterProc. In der Klasse wird ein ChildFenster und in diesem eine ListViewFenster erstellt.
Wenn nun Messages an die Proc geliefert werden, wird das meines Erachtens über das HWND des Child geschehen, wie bekomme ich nun Zugriff auf die Methoden und Klassenvariablen? Bisher ist mir noch keine gebräuchliche Variante eingefallen. Wenn die Proc wirklich immer mit dem HWND des Childs gerufen wird, wäre es schon schön, wenn man den this Pointer in einem Zusatzspeicher des Childs ablegen kann, doch SetWindowLong verunstaltet den Pointer und ein cast auf die Ursprungsklasse ist später dann nicht mehr möglich.
Habt Ihr Ideen oder eine Alternative? Geht es nur über eine externe Referenz die den HWND in Verbindung mit der Instanz ablegt?
Danke für die Hilfe
Buster
-
mit SetWindowLongPtr den this Pointer in GWLP_USERDATA speichern und in der Procedure wieder rausholen mit GetWindowLongPtr
-
HI this,
this kann man nicht direkt ablegen, oder würdest Du das anders bewerkstelligen?
SetWindowLongPtr ( hwnd, GWLP_USERDATA, LONG(this) ) ; LONG Z = GetWindowLongPtr ( hwnd, GWLP_USERDATA ) ;
Dann kommt später allerdings nichts vernünftiges dabei raus!
Buster
-
Das Ergebnis von GetWindowLongPtr in eine long variable abzulegen ist natürlich quatsch. musst du natürlich in deine fensterklasse casten (oder was auch immer this ist). sonst kannst du doch garkeine methode aufrufen.
-
schitt, Du hast denke ich mal wieder Recht
habe vorher etwas probiert, doch auch diese:
ListViewChildP Z = (ListViewChildP)GetWindowLongPtr ( hwnd, GWLP_USERDATA ) ;
Variante kam ich wohl nicht.
THX
Buster
-
ListViewChild* Z = (ListViewChild*)GetWindowLongPtr ( hwnd, GWLP_USERDATA ) ;
Oder ist ListViewChildP == ListViewChild* ?
[ Dieser Beitrag wurde am 04.04.2003 um 17:41 Uhr von WebFritzi editiert. ]
-
klar
-
Yupp! typedef ListViewChild* ListViewChildP;
-
das ist aber ein dümmliches und sinnloses typedef
-
wie mans halt gewohnt ist.
-
-
nie Zeiger typedefen - nur den typen dahinter
-
Also nicht so was:
typedef void (*pfoo)(); pfoo MeinFunktionsZeiger = &Funktion;
Sondern so:
typedef void (foo)(); foo* MeinFunktionsZeiger = &Funktion;
Das ist AFAIK auch gültiger C++ Code.
Aber ob man Funktions(-zeiger) so deklariert oder so, ist wohl echt Geschmacksache.