Nachrichtenverarbeitung als Funktion in einer Klasse



  • Hi,

    ich wollte ein Klasse schreiben mit der ich Fenster erzeugen kann.
    Hierbei soll die Funktion für die Nachrichtenverarbeitung in der Klasse selbst enthalten sein, jedoch bekomm ich immer die Fehlermeldung:
    error C2440: '=' : cannot convert from 'LRESULT (__stdcall CFenster::* )(HWND,UINT,WPARAM,LPARAM)' to 'WNDPROC'
    Weiß jemand wie ich das Problem lösen kann? Es muss aber auf jeden Fall die Nachrichtenfunktion in der Klasse enthalten sein und nicht Global definiert werden.

    mfg Mortl



  • in der FAQ steht glaub ich was dazu



  • Ja, hab ich mir schon angeschaut, da sind ein haufen Lösungsvorschläge drin und keinen davon hab ich kapiert 😕 😃 .
    Könnte vielleicht jemand nochmal einen Posten und ein bisschen erklären?



  • also, meines wissens geht es erstmal nich, eine echte nachrichtenprozedur in einer klasse zu haben. EIne Möglichkeit wäre (unelegant!), falls man nur ein fenster braucht, das handle auf die klasse des fensters global zu speichern und eine globale nachrichtneprozedur macht, die die nachrichten über das globale klassenhandle an dsa fensterobjekt weiterreicht. Ist aber unschön und man kann nur ein fensterobjekt haben.
    Eine andere möglichkeit ist eine globale std::map<HWND, FensterObjekt*> und eine globale Fensterprozedur, welche über die map die handles der fensterklassen rausbekommt und an diese weiterleitet.
    Und dann gibt es noch eine schöne methode (find ich persönlich am schönsten) mit SetWindowLong beim erstellen des Fensters die adresse der Fensterklasse als UserData zu speichern. In der globalen windowproc kannst du dann mit GetWindowLong die Adresse der Fensterklasse schnell rausbekommen und die Nachricht an die Klasse weitersenden.
    Oder du machst eben die ganze klasse statisch und kannst somit aber auch nur ein fenster haben



  • Danke für die schnelle Antwort! Aber mir geht es darum das ich in der Nachrichtenprozedur auf die Elemente der Klasse zugreifen kann, kann man das irgendwie machen?



  • wenn du den pointer auf die fensterklasseninstanz hast (mit getwindowlng zB oder mit der map) kannst du doch über diesen pointer auf die klasse zugreifen



  • Das Thema wurde hier schon öfters behandelt. Unter den Links solltest du ausführlichere Infos erhalten.

    http://www.c-plusplus.net/forum/viewtopic-var-t-is-115790.html
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-107688.html

    Ich würde übrigens die Variante mit this über GetWindowLongPtr/SetWindowLongPtr zu handeln, bevorzugen.


Anmelden zum Antworten