Dialog mehrfach instanziieren
-
Ich programmiere mit der WinAPI und möchte einen Dialog mehrfach gleichzeitig öffnen. Das Problem dahinter ist nun aber dass jede Dialog-Instanz unabhängig von den anderen Dialog-Instanzen sein muss da jede Instanz potentiell ihre eigene Ressourcen (Variablen) benutzt.
Ich benutze den Dialog um Daten durch den Benutzer einzugeben. Ich möchte aber nicht dass wenn der Benutzer zwei Dialoge öffnet und im ersten Dialog einen Wert eingibt, dieser im zweiten geöffneten Dialog sichtbar ist. Objektorientiert betrachtet benötige ich einfach Klasse MeinDialog, welche als Member die EventHandling (MessageProc) Funktion hat.Also etwas in der Form:
class MeinDialog { private: std::string Name; std::string Nachname; public: int CALLBACK EventDialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); void ShowDlg(); }; void MeinDialog::ShowDlg() { // Geht nicht weil hier eine globale Funktion erwartet wird DialogBox(GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_MEINDIALOG), hParent, this->EventDialogProc); }Wie kann ich eine solche Dialog-Klasse mit der WinAPI implementieren ?
-
Die MessageProc muß eine statische Memberfunktion oder eine freie Funktion sein. Den this-Pointer des jeweiligen Objekts musst du der MessageProc übergeben
-
@general bacardi
Wie kann ich denn den this Pointer der Funktion übergeben ? Erstens ist nämlich der Funktionkopf vorgegeben (Typ DialogProc) und zweitens rufe ich die Funktion nicht explizit auf sondern Windows.Ich habe bisher folgendes gemacht:
class MeinDialog { private: std::string Name; std::string Nachname; public: MeinDialog(); ~MeinDialog(); int CALLBACK EventDialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); void ShowDlg(); }; MeinDialog* instance; // Pointer auf aktuelle Instanz // Speichert die akutelle Instanz des Dialogs MeinDialog::MeinDialog() { instance = this; } // Löscht die akutelle Instanz des Dialogs MeinDialog::~MeinDialog() { instance = NULL; } // Delegiert den Aufruf an die aktuelle Instanz int CALLBACK GlobalEventDialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { if (instance != NULL) instance->EventDialogProc(hwndDlg, uMsg, wParam, lParam); } void MeinDialog::ShowDlg() { // Geht nicht weil hier eine globale Funktion erwartet wird DialogBox(GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_MEINDIALOG), hParent, this->GlobalEventDialogProc); }Das Ganze funktioniert nicht gut wenn ich zwei Dialoge gleichzeitig öffnen wollte, denn dann müsste ich zwei freie Eventfunktionen definieren, was recht unschön ist.
-
Bitte ein Bit schrieb:
@general bacardi
Wie kann ich denn den this Pointer der Funktion übergeben ? Erstens ist nämlich der Funktionkopf vorgegeben (Typ DialogProc) und zweitens rufe ich die Funktion nicht explizit auf sondern Windows.Du kannst mit SetWindowLong() beim erzeugen des Fensters den this-Pointer mitgeben. in der DlgProc mit GetWindowLong() dann wieder rausholen. Hab ich vor eininegr Zei mal gemacht und hat gefunzt
-
Danke für die geile Idee !!! 
Einfach den this Pointer in DWL_USER speichern und in der freien Eventfunktion wieder herausholen damit man dann auf die klassenspezifische Eventfunktion aufrufen kann !!!
-
Bitte ein Bit schrieb:
Danke für die geile Idee !!! 
Die Idee ist so alt wie Windows
