MessageSwitch in der WndProc verteilen...
-
Hi, hab n größeres Programm geschrieben, und wollte mal fragen wie das ein bissl entzerren kann... Der Quellcode in der Main.cpp (enthält 'nur' WinMain und WndProc) ist schon ellen lang....hab fast kein Überblick mehr,...hat einer ne Idee wie ich das n bissl verteilen kann (auf andere Dateien) ? Das Problem ist nämlich bspw:
Wenn ich Bei jeder Nachricht eine Funktion aufrufe, die dann die Bearbeitung durchführt...also z.B.:// in der WndProc des Hauptfensters // ... case WM_COMMAND: OnMsgWmCommand(wParam, lParam); break; // ...benötige ich in dieser Funktion seeehr viele Variablen, die in anderen Funktionen auch benötigt werden...daher müsste ich unzählige globale (+ externe) Variablen deklarieren...das ist -wie ich finde- sehr unschön...

Hoffe ihr versteht mein Problem...
Danke schon mal für Tipps/Hilfe!

-

keine Ideen
?
-
Du brauchst nur eine Struktur/Klasse und SetWindowLongPtr/GetWindowLongPtr.
-
Erstmal danke für Antwort...scheint ja als könnte sich keiner herablassen zu antworten
oder die haben alle kein Plan 
Du brauchst nur eine Struktur/Klasse und SetWindowLongPtr/GetWindowLongPtr.
hmm und dann über GWL_USERDATA ? ...naja aber das ändert doch nix
?!
-
Vielleicht ist Deine Frage einfach zu "ungenau"?
Was hast Du denn genau für ein Problem. Ein Fenster mit einer WndProc? Oder 100 Fenster mit einer WndProc?
-
Ich glaub er hat die Antwort (bzw. das Konzept dahinter) nicht verstanden
1. Datei: Basisklasse mit den Grundvariablen
2..jeweils Ableitungen mit weiteren Variablen
Hauptdatei: eine Instanz der abgeleiteten Klasse dessen Funktionen in der WndProc aufgerufen werden
Wenn es nur ein Fenster ist im Notfall mit einer globalen Variable, ansonsten, wie in der ersten Antwort gedacht, dem Fenster mitgeben.
-
hi zusammen,
also das:Lui schrieb:
Ich glaub er hat die Antwort (bzw. das Konzept dahinter) nicht verstanden
1. Datei: Basisklasse mit den Grundvariablen
2..jeweils Ableitungen mit weiteren Variablen
Hauptdatei: eine Instanz der abgeleiteten Klasse dessen Funktionen in der WndProc aufgerufen werden
Wenn es nur ein Fenster ist im Notfall mit einer globalen Variable, ansonsten, wie in der ersten Antwort gedacht, dem Fenster mitgeben.bestätigt wohl das:
Jochen Kalmbach schrieb:
Vielleicht ist Deine Frage einfach zu "ungenau"?
Was hast Du denn genau für ein Problem. Ein Fenster mit einer WndProc? Oder 100 Fenster mit einer WndProc?hab meine Frage wohl wirklich zu ungenau gestellt. -sry-
Also noch n paar Infos:
- Ein Fenster, eine WndProc
- dieses Fenster beinhaltet (bzw. erstellt unter WM_CREATE) einige Controls, somit wird
vllt. schon deutlich, dass das Programm viele Benutzerbefehle verarbeiten muss.
- weiterhin hab ich auch bspw. Drag&Drop Support, Aufruf über die Befehlszeile usw./usf.
implementiert...
daraus resultiert jetzt ein sehr großes switch (für die WindowMessages), da es einerseits sehr viele verschiedene Nachrichten gibt und andererseits ist jeder einzelne Case-Zweig sehr groß
Ein Pseudobeispiel:
LRESULT CALLBACK WndProc(HWND hWnd, UINT uiMessage, WPARAM wParam, LPARAM lParam) { switch(uiMessage) { case WM_CREATE: // Controls erstellen, Initialisierungen etc. ... // ... // ... // ... break; case WM_COMMAND: // GROßES switch für die ganzen ID's ... // entsprechend große case-Zweige, kommt auf // Komplexität der jeweiligen Funktion des Controls an. // ... // ... // ... break; // Hier kommen noch viele weitere Messages // ... // ... // ... default: return (DefWindowProc(...)); } return (0L); }Wie jetzt hoffentlich deutlich, wird die WndProc riesen groß, dabei verliert man schnell den Überblick, sinnvoll wäre es also einen Teil des Code auszulagern (wie auch immer...das is ja meine Frage?!
...z.B. in: Funktionen bzw. neue Cpp-Dateien).
Das Problem hierbei nur:Cooly schrieb:
Wenn ich Bei jeder Nachricht eine Funktion aufrufe, die dann die Bearbeitung durchführt...also z.B.:
// in der WndProc des Hauptfensters // ... case WM_COMMAND: OnMsgWmCommand(wParam, lParam); break; // ...benötige ich in dieser Funktion seeehr viele Variablen, die in anderen Funktionen auch benötigt werden...daher müsste ich unzählige globale (+ externe) Variablen deklarieren...das ist -wie ich finde- sehr unschön...

Hoffe ihr versteht mein Problem...
So wenn das auch noch ungenau ist, dann lasst es mich wissen
und sry nochmal für die ungenaue Erklärung anfangs 
-
Wo sind die Variablen denn jetzt? static in der WndProc oder was? Wenn du so viel kram brauchst, mach halt eine Struktur in der alles drin ist, dann ist es nur noch ein parameter oder 1 globale variable.
-
toleron schrieb:
Wo sind die Variablen denn jetzt?
alle global...sind sehr viele...aber im struct...naja dann übergeb ich immer alle vars, obwohl ich nur n 1/4 gerade mal brauch

-
anders gehts nicht. entweder so oder du überlegst mal ob du dein ganzes programm nicht besser strukturieren kannst. wenn du zig globale variablen hast ist das generell schon mal nicht so toll. lässt sich sicherlich irgendwie besser lösen.
-
wenn du zig globale variablen hast ist das generell schon mal nicht so toll. lässt sich sicherlich irgendwie besser lösen.
ichw eiß ...globale Vars sind nit dolle...aber die hab auch nur gemacht, weil ich für meine MsgHandling Routinen eingies an Daten bereitstellen musste, und das mit Parametern zu machen wär wahnsinn...