MDI-Fenster-Wrapper
-
static LRESULT CALLBACK stWinMsgHandler (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { TWndObject* pWnd; if (uMsg == WM_NCCREATE) { SetWindowLong(hWnd, GWL_USERDATA, (long)((LPCREATESTRUCT(lParam)) ->lpCreateParams)); } pWnd = (TWndObject*)GetWindowLong(hWnd, GWL_USERDATA); if (pWnd) { if (uMsg == WM_NCCREATE) { pWnd->OnNCCreate(); } ... } }Wenn ich diese Nachrichtenfunktion für ein MDIChild verwende, wird das MDI-Fenster nicht erstellt, bei einem normalen Fenster oder MDI-Frame macht dieser Code jedoch keine Probleme. Meine Vermutung besteht darin, dass meine SetWindowLong und GetWindowLong-Aufrufe nicht mit einem MDI-Fenster kompatibel sind. Kennt einer die Ursachen für das Problem?
-
Ich vermute mal, der Cast ist nicht wirklich das, was du benötigst. Der lpCreateParam enthält laut MSDN entweder ein CLIENTCREATESTRUCT oder ein MDICREATESTRUCT, die nicht wirklich miteinander übereinstimmen.
PS: Was macht es eigentlich für einen Sinn, den Wert erst ins Fenster zu schreiben und dann sofort wieder auszulesen?
-
Und was kann ich dann noch tun?
Ich habe auch den folgenden Code von flenders ohne Erfolg probiert:
http://www.c-plusplus.net/forum/87227
-
wenn ich das jetzt aus der MSDN richtig verstanden hab, wird MDICREATESTRUCT nur verwendet wenn das erstellte fenster einen elternteil hat.
...If the window being created is a MDI client window, this member contains a pointer to a CLIENTCREATESTRUCT structure. If the window being created is a MDI child window, this member contains a pointer to an MDICREATESTRUCT structure.
du müstest also nur nachfragen ob hWnd einen elternteil hat, bzw. hWnd in kindfenster ist. somit weist du welche strucktur gerade benötigt wird!