Kann nicht mit PreCreateWindow() den Fensterstil verändern



  • Die Testanwendung "window" hat folgende Einstellungen: Multi Top-Level Docuements, mit Doc/View-Unterstützung, Container.

    Folgender Code:

    BOOL CwindowView::PreCreateWindow(CREATESTRUCT& cs)
    {
    	// TODO: Modify the Window class or styles here by modifying
    	//  the CREATESTRUCT cs
    	cs.style = WS_THICKFRAME;
    
    	return CView::PreCreateWindow(cs);
    }
    

    Der Build-Prozess verläuft erfolgreich. Beim Ausführen erscheint jedoch folgender Fehler:

    Debug Assertion Failed!
    Program: e:\...\window\debug\window.exe
    File: f:\rtm\vctools\vc7libs\ship\atlmfc\src\mfc\viewcore.cpp
    Line: 63

    For information on how your program can cause an assertion failure, see...

    Beim Klicken auf "Ignore" folgt die Meldung "Fehler beim Erstellen eines leeren Dokuments."

    Beim Klicken auf "Retry" kommt die Meldung "window.exe has triggered a breakpoint", beim Klicken auf "Break" wird der Ausführprozess abgebrochen.

    Wenn ich auf "Ignore" geklickt habe, folgender Debug-Output:

    Warning: Window creation failed: GetLastError returns 0x00000579
    Warning: could not create view for frame.
    Failed to create client pane/view for frame.
    Warning: Window creation failed: GetLastError returns 0x00000000
    Warning: failed to create CFrameWnd.
    Warning: CDocTemplate couldn't create a frame.
    The thread 'Win32 Thread' (0x774) has exited with code 0 (0x0).
    The thread 'Win32 Thread' (0x42c) has exited with code 0 (0x0).
    The program '[260] window.exe: Native' has exited with code 0 (0x0).

    Andere Sachen funktionieren, wie z.B. CDC::TextOut().

    Was ist der Fehler? Ich habe sonst keinerlei Änderungen am vom MFC-Assistenten erstellten Code vorgenommen.

    Der Fehler ist nur nicht da, wenn ich keine Doc/View Unterstützung verwende.

    A-jage


  • Mod

    Das ist ein ungültiger Stil.
    Wenn Du diesen Stil hinzufügen möchtest musst Du den OR operator verwenden:

    BOOL CwindowView::PreCreateWindow(CREATESTRUCT& cs)
    {
        cs.style |= WS_THICKFRAME;
        return CView::PreCreateWindow(cs);
    }
    


  • Mittlerweile habe ich die Fehlerquelle - es lag nicht am "=", denn mit "|=" hab ich es auch probiert. Da hat er zwar keine Fehlermeldung ausgegeben, doch leider wurde der Stil "Thickframe" auch gar nicht dem Fenster hinzugefügt.

    Ich hab es jetzt in CMainFrame::PreCreateWindow() statt CView::PreCreateWindow() reingeschrieben, und es klappt.
    Da fragt man sich als C++/MFC-Anfäner aber: Wozu ist dann CView::PreCreateWindow() überhaupt da?

    A-jage


  • Mod

    Jedes Fenster hat seinen eigenen Stil. PreCreateWindow wird verwendet um den entsprechenden Stil eben anzupassen...

    Ein CMainFRame enthält evtl. eben ein MDI-Frame WIndiw welches wieder ein MDI-CHild enthält und dieses enthält wieder den View. Alles Fenster, alle haben einen eigenen Stil.



  • Ja, doch warum entsteht dann dieser Fehler? Denn, wie gesagt: Am "=" bzw. "|=" lag es nicht.

    A-jage


  • Mod

    a-jage schrieb:

    Ja, doch warum entsteht dann dieser Fehler? Denn, wie gesagt: Am "=" bzw. "|=" lag es nicht.

    A-jage

    Du hast dem View einen Stil verpasst der ungültig ist. Der View intern mus wenigstens den WS_CHILD Stil haben! Zudem ist WS_THICKFRAME für Child Windows IMHO inkompatibel.



  • Aso, ok.

    A-jage


Log in to reply