Win32 Fenster sauber beenden

Thomasio

Erfahrenes Mitglied
Meine Anwendung führt beim Start ein paar Prüfungen durch, z.B. ob das Fenster grösser ist als der Desktop, und wenn ja, dann soll die Anwendung gleich wieder schliessen.

Code:
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR szCmdLine,int nCmdShow)
{

if(irgendwas)
  {
      return 0;
  }

// ... RegisterClassEx();

hwnd = CreateWindow(
                     "MeinFenster",
                     "MeinFensterName",
                     WS_POPUP|WS_SYSMENU|WS_MINIMIZEBOX|WS_CLIPCHILDREN|WS_THICKFRAME|CS_DROPSHADOW,
                     0,0,750,500,
                     HWND_DESKTOP,0,hinstance,0
                   );

if(CheckWindowSize(hwnd))
  {
      return 0;
  }

ShowWindow(hwnd,nCmdShow);
UpdateWindow(hwnd);

// ... MessageLoop

}

Die Frage ist jetzt:
Die irgendwas-Abfrage ist problemlos, weil an der Stelle noch nichts aufzuräumen ist, aber wenn CheckWindowSize() Error zurück gibt, und die Anwendung schliesst ohne den MessageLoop zu starten, was passiert mit dem (unsichtbaren) Fenster?
Räumt Windows da automatisch auf, oder bleibt das im System hängen?
 
Sauberer Programmierstil ist es, wenn du mal grundsätzlich davon ausgehst, dass alles im System hängen bleiben würde (auch wenn es nicht so ist). Du kannst das Fenster via DestroyWindow wieder aufräumen und die Klasse via UnregisterClass löschen.
 
Blöde Frage: Da du das Fenster ja selbst erstellst, weißt du da nicht schon vorher, ob es zu groß ist? Dann könntest du dir das Problem direkt sparen.
 
WENN das ganze ausschliesslich auf meinem PC laufen müsste, klar, dann könnte ich mir das schenken.
Sinn der Aktion ist zu lernen, wie das geht, damit ich irgendwann auch mal etwas von mir weitergeben kann.
 
Was Endurio meint ist etwas anderes. Du kannst ja offensichtlich abfragen wie groß das Fenster sein darf. Also kannst du es auch direkt in einer größe erstellen die auch auf den Bildschrim passt, oder wenn das nicht geht das Fenster erst gar nicht erstellen. Dann hast du auch nicht das Problem ein unsichtbares Fenster zu löschen.
 
Das funktioniert so einfach auch wieder nicht.
Das Fenster hat eine innere Grösse von 750x500, aber da kommt noch der Rahmen dazu.
Abhängig davon was der User für Desktop-Einstellungen hat kann "WS_THICKFRAME" grosse Unterschiede machen.
Dazu kommt noch die Frage, wo der User seine Taskleiste hat und wie gross sie ist.
Wenn der User dann noch mehrere Monitore mit erweitertem Desktop hat, ist mit Vorausberechnen nicht mehr viel zu machen, spätestens wenn das Ganze in einer VM laufen soll mit völlig frei wählbarer Auflösung wird das ein Krampf.

Ich mache das halt so, dass ich das Fenster "hidden" erstelle, seine Grösse abfrage, daraus den Rahmen errechne und dann schaue ob das in irgendeinen der vorhandenen Monitiore passt.
 
Hui, die Funktion kannte ich nicht.
Das könnte die Lösung sein, muss ich mal ein bischen basteln damit.
Vielen Dank.
 
Zurück