Rahmenfenster an Ansicht anpassen
Soll eine Ansicht eine vorgegebene Größe (das ist der
Bereich innerhalb dessen später gezeichnet wird) besitzen, so kann die
gewünschte Größe nicht in der Methode PreCreateWindow(...) der Ansicht
eingestellt werden, da das Rahmenfensters die Ansicht immer an seine Größe
anpasst. Vielmehr kann die gewünschte Größe erst nach der kompletten Erstellung
des Rahmenfensters und der Ansicht angepasst werden.
Je nach dem, ob die Größe der Ansicht fest vorgegeben oder von anderen
Bedingungen abhängig ist (z.B. Größe einer darzustellenden Grafik), kann die Ansichtsgröße entweder in der Methode
OnCreate(...) oder OnSize(...) des
Ansichtobjekts festgelegt werden. Eventuell muss zusätzlich noch der Stil des
Rahmenfensters so angepasst werden, dass ein verändern der Fenstergröße über
Ziehen am Rahmen usw. ebenfalls ausgeschlossen wird (siehe dazu ersten
Tipp&Trick in diesem Kapitel).
Ist die gewünschte Größe der Ansicht immer konstant, so kann die Anpassung
der Größe in der Methode OnCreate(...) des Ansichtobjekts erfolgen. Hierzu
wird zunächst der CWnd Methode CalcWindowRect(...) die
gewünschte Größe der Client-Area der
Ansicht übergeben. Die Methode berechnet dann daraus die Größe des
notwendigen Fensters, d.h. einschließlich des Rahmens. Die so ermittelte
Größe entspricht nun der Größe der Client-Area des Rahmenfensters. Wird
jetzt CalcWindowRect(...) erneut aufgerufen, aber diesmal als Methode des
Rahmenfensters, so wird schließlich die notwendige Größe des Rahmenfensters berechnet. Die von
CalcWindowRect(...) erhaltene Größe ist dann noch zu
normieren, d.h. das erhaltene Rechteck ist so zu verschieben dass der linke und
obere Rand den Wert 0 annimmt. Anschließend ist zur berechneten Größe des
Rahmenfensters noch die Höhe der Titelzeile hinzu zu addieren. Zum Schluss
ist mit der bereits bekannten Methode SetWindowPos(...) die Größe des Rahmenfensters
entsprechend einzustellen.
int CChildView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CWnd ::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Speziellen Erstellungscode hier einfügen
// Groesse der Ansicht (View) festlegen
const int nXSIZE = 300;
const int nYSIZE = 200;
CRect CArea(0,0,nXSIZE,nYSIZE);
// Berechne aus Groesse der Client-Area der Ansicht die
// Groesse des umschliessenden Fensters
CalcWindowRect(&CArea,CWnd::adjustOutside);
// Berechnen aus Groesse des Fensters der Client-Area die
// Groesse des Rahmenfensters
GetParentFrame()->CalcWindowRect(&CArea,CWnd::adjustOutside);
// Groesse normieren so dass left=top=0 ist
CArea.OffsetRect(-CArea.left,-CArea.top);
// Nun noch zur Fenstergroesse die Hoehe der Titelzeile hinzuaddieren
CArea.bottom += GetSystemMetrics(SM_CYCAPTION);
// Groesse des Rahmenfensters nun anpassen
GetParentFrame()->SetWindowPos(NULL,0,0,CArea.right,CArea.bottom,SWP_NOZORDER|SWP_NOMOVE);
return 0;
} |
Ist die Größe der Client-Area der Ansicht von Bedingungen abhängig
die erst zur Programmlaufzeit ermittelt werden können, so kann die Anpassung
auch in der OnSize(...) der Ansicht erfolgen. Zu beachten ist dabei aber, dass
OnSize(...) standardmäßig bei jeder Größenänderung des Fensters aufgerufen wird.
Das fertige Bespiel finden Sie unter 03EPMMFC\ViewSize.
Damit sind die Tipps&Tricks beendet und es normal geht mit dem Kurs weiter.
|