Benutzerdefinierte Windows Prozedur mit zusätzlichen Argumenten möglich?
-
Hallo, ich habe eine Problem, beziehungsweise eine Frage...
Und zwar möchte ich dass die WindowsProzedur keine globalen Variablen benötigt, sondern eine Möglichkeit bekommt lokale Variablen zu benutzen, indem die Anzahl der Argumente erweitert wird.
LRESULT CALLBACK CustWndProc(HWND hwnd, unsigned int message, WPARAM wParam, LPARAM lParam, int i);Die Windows Klasse nimmt sie auch an, sofern ich sie mit (WNDPROC) caste...
Es scheint auch alles prima zu funktionieren, bis ich das Fenster durch eine WM_DESTROY Nachricht zerstört wird -> i beinhaltet Müll...
Da ich relativ neu dabei bin was C++/WinAPI programmierung betrifft, war ich mir nicht genau sicher wie sich soetwas auf den Message Loop auswirkt, daher habe ich vorsichtshalber eine eigene DispatchMessage Funktion geschrieben, aber ob die wirklich sinnvoll ist weiss ich nicht

while((status = ::GetMessage(&msg, 0, 0, 0)) != 0) { ko = rand() % 2000 + 1000; if(status == -1) { return -1; } if (msg.hwnd == window.RetWnd() ) //checkt ob die nachricht wirklich ans Hauptfenster gerichtet ist? { ko = rand() % 1000 + 1000; CustWndProc(msg.hwnd,msg.message ,msg.wParam ,msg.lParam , ko); } else ::DispatchMessage(&msg); }CustWndProc(HWND hwnd, unsigned int message, WPARAM wParam, LPARAM lParam, int i) { switch(message) { case WM_DESTROY: Beep(i,1000); ::PostQuitMessage(0); return 0; break; case WM_LBUTTONUP : Beep(i,1000); break; } return ::DefWindowProc(hwnd, message, wParam, lParam); }Der Beep funktioniert einwandfrei im WM_LBUTTONUP case...DESTROY ist wiegesagt buggy...
Meine Frage...macht das alles hier Sinn?
Falls ja...was mache ich falsch, beuiehiehungsweise, was sollte ich anders machen um es zu verbessern?
Falls nein...welche Alternativen habe ich?
In diesem Fall müsste ich die Variabel der Frequenz für den Beep global anlegen...
Da muss es doch was anderes geben...
Vielen Dank im voraus!

-
Das ist Quatsch und kann icht gehen. Keine der zwischenliegenden Schichten wird diese Argumente transportieren.
Für lokalen Speicher im Fenster gibt es Tausende von Varianten
1. GetProp/SetProp
2. Get/SetWindowLong GWL_USERDATA
3. RegisterClass und cbWndExtra in Verbindung mit Get/SetWindowLong
4. Eigene Map mit Zugriff über Window Handle...
To be conintued...
-
Eine einfache Möglichkeit scheint mir die Benutzung einer globalen Varible "int i", wenn du dann Schreib-/Manipulationsvorgaänge an der Variable durchführst solltest du sie in eine Criticalsection kapseln.
-
Unwissend schrieb:
Eine einfache Möglichkeit scheint mir die Benutzung einer global Variable "int i", wenn du dann Schreib-/Manipulationsvorgaänge an der Variable durchführst solltest du sie in eine Critical section kapseln.
Und was macht er, wenn er von dieser Fensterklasse 20 Fenster anlegt.
Das Kapseln mit einer Ccriticalsection ist bei Fensterdaten absolut unnötig/unüblich, denn üblicherweise liegen alle Fenster in einem Thread!
-
Wenn er 20 Fenster anlegt macht er eben ein array of int, int i[20], war auch nur als weitere Möglickeit gedacht. Wenn er nur ein Fenster so erstellen will, ist mein Vorschlag mit der globelen Variable auf jeden Fall super gut, bääääääh.
