Fenstergröße an Clientbereichsgröße anpassen
-
Hallo Forum,
ich versuche eine MFC-SDI-Anwendung auf eine bestimmte Größe einzustellen.
Der Client-Bereicht (unter der Toolbar) soll genau 352 x 288 Pixel groß
sein. Beim herumspielen bin ich auf 2 Fragen gestoßen:GetClientRect() liefert die Größe des Clientbereichts und GetWindowRect()
liefert die obere linke und untere rechte Ecke des Fenster (Clientbereich).
Berechnet man aus diesen beiden Koordinaten wieder die Größe, sollte doch
eigentlich die gleiche Größe wie bei GetClientRect() herauskommen. Aber die
mit GetWindowRect() berechnete Größe ist um 4 Pixel höher und breiter.
Warum?In CTestView::OnInitialUpdate() setzte ich die Größe des Hauptfensters
momentan noch manuell (siehe Code). Wie kann ich das aber berechnen, so
dass bei einer anderen gewünschten Größe des Clientbereichs die Größe des
Hauptfensters richtig angepasst wird?
Ohne eine Größenänderung ist bei mir der Clientbereich 756 x 470, bzw.
756 x 445 (ohne Toolbar) groß. Keiner der im Code ermittelten Werte stimmt
mit diesen überein.
Nur die Größe des Hauptfensters (768 x 537) läßt sich präzise mit
GetParentFrame()->GetWindowRect() bestimmen.
Wie kann ich also die Größe des Hauptfensters jeweils an meine gewünschte
Clientgröße anpassen?Vielen Dank.
void CTestView::OnInitialUpdate(){ CView::OnInitialUpdate(); CRect ClientRect; CRect WindowRect; CRect ParentClientRect; CRect ParentWindowRect; // So groß soll der Innenbereich sein, Scrollleisten werden // nicht vorhanden sein CSize DesiredClientSize = CSize(352, 288); GetClientRect(&ClientRect); // top=0, bottom=487, left=0, right=756 (756 x 487) GetWindowRect(&WindowRect); // top=130, bottom=621, left=92, right=852 (760 x 491) GetParentFrame()->GetClientRect(&ParentClientRect); // top=0, bottom=491, left=0, right=760 (760 x 491) GetParentFrame()->GetWindowRect(&ParentWindowRect); // top=88, bottom=625, left=88, right=856 (768 x 537) // Das Hauptfenster so ändern, dass der Innenbereich 352 x 288 Pixel groß ist GetParentFrame()->SetWindowPos(NULL, 0, 0, DesiredClientSize.cx + 12, DesiredClientSize.cy + 91, SWP_NOMOVE | SWP_NOZORDER); }
-
GetWindowRect gibt die Fenstergrösse INKLUSIVE Rahmen aus, in Screen-Koordinaten.
-
OK, so funktioniert es. Wenn man allerdings eine Toolbar und eine
Statusleiste hat, muss man 42 Pixel addieren. Geht das vielleicht
noch eleganter?void CCamStudioView::OnInitialUpdate(){ CView::OnInitialUpdate(); CRect tmpClientRect; CRect tmpParentWindowRect; GetClientRect(&tmpClientRect); GetParentFrame()->GetWindowRect(&tmpParentWindowRect); long tmpExtraWidthX = tmpParentWindowRect.Width() - tmpClientRect.right; long tmpExtraWidthY = tmpParentWindowRect.Height() - tmpClientRect.bottom; // ToolBarHeight + StatusBarHeight; tmpExtraWidthY += 42; CSize tmpImageSize = pDoc->GetImageSize(); GetParentFrame()->SetWindowPos(NULL, 0, 0, tmpImageSize.cx + tmpExtraWidthX, tmpImageSize.cy + tmpExtraWidthY, SWP_NOMOVE | SWP_NOZORDER); }