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!


Anmelden zum Antworten