Rahmenfenster an Ansicht anpassen

Zurück Zum Inhaltsverzeichnis Weiter

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.

Zurück Zum Inhaltsverzeichnis Weiter


Copyright © 2004

Senden Sie Emails mit Fragen oder Kommentaren zu dieser Website an: mailto:info@cpp-tutor.de
 Wolfgang Schröder, Lerchenweg 23, D-72805 Lichtenstein. Tel: +49 7129 6470