Wie bei gegebener Client-Größe die Fenstergröße berechnen?



  • Wenn ich einen Client-Bereich sagen wir 800*600 haben will, wie groß muß ich dann mit Create mein Gesamtfenster machen?
    Ich hab mit GetSystemMetrics die SM_CXSIZE usw geholt, aber es passt immer noch nicht (immer so etwa 5-6 Pixel zu flach).



  • Schau dir mal SystemParametersInfo an und besonders den Abschnitt "Window parameter". 🙂



  • Danke für die Antwort, aber es klappt immer noch nicht richtig.
    Die Werte, die ich mit SystemParametersInfo rauskriege, sind im Prinzip dieselben wie mit GetSystemMetrics!
    z.B. kriege ich für die Fenster-Rahmenbreite 4 Pixel angezeigt, für die "Caption"-Leiste 26 Pixel. Zumindest die Caption-Leiste ist aber breiter als 26. Und das führt dann dazu, dass das Fenster zu klein ausfällt für den gewünschten 800*600 Client-Bereich.

    Weiss noch jemand einen Lösungsansatz?



  • Du hast den Lösungsansatz nicht weit genug verfolgt - über der Caption ist noch ein Rahmen.
    Ein Fenster besteht aus zig Teilen, schau dir an, was es alles gibt und prüfe dann, ob das an der Stelle vorkommt. Nicht gucken, was du hast und raussuchen, da übersiehst du was!



  • Vielen Dank für die Tipps. Mit den System-Metriken die Größe zusammenzupfriemeln hat leider nicht befriedigend geklappt. Ich wusste nie, ob das jetzt gerade die richtigen Parameter waren, die ich zusammenaddiert habe, oder ob es eher zufällig bei meinen Desktop-Einstellungen passt.

    Es gibt bei MFC einen besseren Weg: CalcWindowRect()

    Das sieht so aus, dass man nach dem Create() CalcWindowRect() aufruft, um das Window-Rect zu ermitteln, das man einstellen muss um eine gewünschte Client-Grösse zu erhalten. Also:

    // pF ist Pointer zum Fenster
    pF->Create(NULL,"Fenster",WS_OVERLAPPEDWINDOW,rectDefault);
    CRect r (0,0,800,600); // gewünschte Client-Grösse
    pF->CalcWindowRect(&r,CWnd::adjustOutside);
    pF->MoveWindow(x,y,r.Width(),r.Height());
    

    und dann irgendwann weiter mit ShowWindow() etc.


Anmelden zum Antworten