Frage zu CWnd:DestroyWindow



  • Also wenn ich mir ein Fenster mit CWnd erstelle und dann die Anwendung einfach schließe, sorgt dann die CWnd-Klasse dafür, dass DestroyWindow aufgerufen wird?. Weil bei mir kommen die Warngungen

    Warning: calling DestroyWindow in CWnd::~CWnd; OnDestroy or PostNcDestroy in derived class will not be called.
    Warning: calling DestroyWindow in CWnd::~CWnd; OnDestroy or PostNcDestroy in derived class will not be called.

    Ich öffne im Hauptdialog 2 nicht modale Fenster(keine Dialogklasse, eine eigene welche von CWnd erbt).
    Wenn ich aber z.B. im Destruktor noch ein Destroy Window mache, gibts nen Fehler.

    Ist die Warnung jetzt nur ein Hinweis, dass ich die Methode nicht überschrieben habe und und ich das evtl wollen könnte, oder wird da der Fensterspeicher tatsächlich nicht wieder freigegeben?


  • Mod

    Dein Problem ist, dass ein Objekt zerstört ist, bei dem noch das Fenster existiert.

    Egal wie, der normale Weg heißt immer: Erst das Fenster zu zerstören mit DestroyWindow.
    Das CWnd::Objekt zerstört sich entweder selbst oder wird eben über den Stack entsorgt.

    Wie hast Du denn diese Objekte angelegt? Als member in dem Dialog?



  • Jo genau da
    Warum klappt es denn nicht, wenn ich im Destruktor das DestroyWindow aufrufe?

    Oder wie kann man sowas am besten machen?
    In älteren Projekten habe ich dann angefangen, die CLose nachricht abzufangen, ne Nachricht an das "Elternfenster" zu schicken udn dieses musst dann "per Hand" schließen und dann das Fenster zerstören.
    Das ist aber doch ziemlich aufwendig. Da gibts doch sicher einfacherere udn elegantere Methoden?


  • Mod

    Setz doch mal einen Breakpoint auf den Destruktor von CWnd.
    Scheinbar wird vorher das Objekt schon per delete evtl. zerstört.



  • Martin Richter schrieb:

    Setz doch mal einen Breakpoint auf den Destruktor von CWnd.
    Scheinbar wird vorher das Objekt schon per delete evtl. zerstört.

    Neeeee, daran liegt es sicher nicht. dass das Objekt vorher zerstört wird.
    Ich habe eher den Verdacht, dass die Hauptanwendung beim Schließen vorher schon irgendwas da macht.
    Wie machen denn andere sowas?


  • Mod

    Aber dieser Trace kommt aus dem Destruktor won CWnd! Das kanst Du in der Source der MFC genau sehen! Dieser Text kommt nur einmal an dieser Stelle vor.



  • ok, aber mein CWnd ist eine Membervariable in einem Dialog. Es wird also nix dynamisch mit new angelegt. An welcher Stelle soll dann die doppelte Freigabe erfolgen, wenn ich im Destruktor des Dialogs das DestroyWindow aufruf?#

    Ma so nebenbei: wie machen dann andere sowas? Werden doch sicher ein paar Leutz hier mal mehrere Fensterklassen benutzen, die auch an geeigneter Stelle freigegeben werden müssen ?!?!


  • Mod

    Ich mache es genauso. Ich habe auch einfach eine Membervariable in der Klasse.
    Frage: Wie zerstört sich Dein Dialog? Zersörst Du den evtl. mit delete. Ist der nicht modal und geht aus dem Scope?



  • Ist eine einfache Dialogfeldanwendung, mit dem Projekt-Assistenten erstellt und diese öffnet halt 2 neue Fenster zur Anzeige von Grafiken.


  • Mod

    Pellaeon schrieb:

    Ist eine einfache Dialogfeldanwendung, mit dem Projekt-Assistenten erstellt und diese öffnet halt 2 neue Fenster zur Anzeige von Grafiken.

    Du schreibst öffnen! Wenn dise Fenster keine Child Windows sind, werden diese beim Schließen des Dialoges nicht zerstört.



  • jo darum gehts! An welcher Stelle ich die am einfachsten freigeb.


  • Mod

    Wenn es eigene Overlapped Windows sind, solltest Du einen WM_DESTROY Handler bauen und dort DestroyWindow aufrufen.
    Aber warum sind diese Fenster Overlapped? Warum sind es keine Child Windows? Naja ist Dein Design.



  • Und wie kann ich Child-Windows machen, ohne das diese auf den Bereich des Elternfensters beschränkt sind?


  • Mod

    Ok! Wenn dies eine Anforderung ist, dann gehen Childwindows nicht.



  • Also bleibt wohl nur der Weg, sich da ne Kontrollstruktur drumzubauen .... hm schade


Anmelden zum Antworten