[MFC] CDialog - Minimale Grösse

Peter

Lt. Commander
Registriert
Mai 2001
Beiträge
1.957
Ich bastel mal wieder wieder was in C++ :)
Nun habe ich mich entschieden die Oberfläche in einen CDialog zu packen, dessen Grösse veränderlich ist durch einen 'ziehbaren' Fensterrand.

Das Problem ist nun, dass ich gewährleisten muss, dass eine vorgegebene minimale Fenstergrösse nicht unterschritten wird.
Wenn ich nun die OnSize-Methode überschreibe, scheint das Framework trotzdem noch die Message zu erhalten und die Fenstergrösse lässt sich weiter minimieren.
Momentan sieht meine OnSize()-Methode wie folgt aus:
Code:
void CMainDialog::OnSize( UINT nType, int cx, int cy) 
{
    CRect cRect;
    GetWindowRect( &cRect);

    if ( (cx<500) || (cy<300) )	// Min wnd size
    {
        MoveWindow( cRect.left, cRect.top, 500, 300);
        return;
    }

    CDialog::OnSize( nType, cx, cy);
}
 
Kenne mich ja in C++ nicht so gut aus, bevorzuge Delphi... trotzdem hier mein Vorschlag:

void CMainDialog::OnSize( UINT nType, int cx, int cy)
{
CRect cRect;

GetWindowRect( &cRect);

if ( (cx<500) || (cy<300) )// Min wnd size
{
cx = 500; cy = 300;
MoveWindow( cRect.left, cRect.top, cx, cy);
}
CDialog::OnSize( nType, cx, cy);
}

Das 'return' wuerde ich rausnehmen (Auszug aus meinem MFC Buch: '... When you override a frame window's OnSize handler, it's a good idea to call the base class's OnSize handler, too.'
Dabei waere es sogar einen Versuch wert, ob das MoveWindow wirklich benoetigt wird.

Wenn's nicht klappt, bitte nicht hauen :-)
 
Hier wird niemand verhauen, hier wird gleich gebannt ;)

Geht leider beides nicht. Das return kann ich rausnehmen. Ändert nichts an der momentanen Funktionsweise. Wenn ich aber das MoveWindow() entferne, dann kann ich das Fenster kleiner machen als z.B. 500x300.

/* Nachtrag:
* Habe mal das Projekt angefügt. Die OnSize Methode liegt
* in der Klasse MainDialog.
*/
 

Anhänge

  • Projeto2.zip
    16,5 KB · Aufrufe: 414
Zuletzt bearbeitet:
Tja Peterchen, wenn du mit der Qt-Bibliothek programmieren würdest, dann würde es so funktionieren:
Code:
yourDialogObject->setMinimumSize( 500, 300);
Kleiner geht dann nicht, aber alles Größere ist OK.
QT hat sehr ausgeklügelte Layouting-Mechanismen. Ich glaube das fehlt den MFC.

Aber du willst ja unbedingt das droga MFC. Das ist dann für die Hardcore Typen wie dich :D.
 
Nein, ist dieses Mal nicht auf meinem Mist gewachsen :)

Professor an der Uni hier meinte, dass wir etwas OpenGL programmieren (Graphische Algorithmen) und das 'Drumrum' eben mit MFC gestalten.
 
Ich habe heute Abend mal MS VC++6 Standard installiert und Dein Projekt geladen. Abgesehen davon, dass das Vergroessern des Fenster flackert, da staendig die Methode 'MoveWindow' ausgefuehrt wird, funktioniert es.

Desweiteren wirst Du wohl etwas mehr Arbeit haben ... Angenommen, ich vergroessere das Fenster auf 720x400 und aendere danach die vertikale Groesse auf 300 oder weniger, dann wird meine horizontale Groesse auch automatisch auf 500 gelegt. Aber eigentlich sollte die Groesse ja jetzt 720x300 betragen, oder? Also wirst Du wohl noch Fallbezogen X-Groesse und Y-Groesse abfragen / anpassen muessen.

Wie gesagt, bei mir funktioniert es vom Prinzip her.

Meine Entwicklungsumgebung, falls das hilfreich ist:

Windows 2000 Pro (SP4) English
MS Visual C++ 6.0 Standard (SP6) incl. MFC 4.2 (dynamische Libs) English

Gruesse und viel Glueck!
 
Die Methode war auch nur zum Testen gedacht, daher die zusammengefasste if-Abfrage. Das wird natürlich geändert, sobald die Funktion an sich funktioniert.
Vom Prinzip her läuft es bei mir auch, aber ich würde das Flackern eben noch gerne abstellen.
 
Versuch mal, mit SetWindowPos anstatt mit MoveWindow zu arbeiten. Und dann SWP_NOMOVE und SWP_NOZORDER bei den Flags anzugeben. Eventuell auch mal SWP_NOREDRAW probieren, könnte aber nicht unbedingt schön aussehen.
 
Zurück
Oben