Fenstergröße zur Laufzeit anpassen

mgheinz1001

Grünschnabel
Hallo,

ich habe ein Problem mit dem Anpassen der Fenstergröße einer FormView: ich möchte die Größe gern zur Laufzeit anpassen können. Ich habe es mit 'SetWindowPos' und 'MoveWindow' versucht, beides hat nicht geklappt.

In 'OnCreate' meine FormView gelingt es mir noch die Größe anzupassen. Danach ändert sich allerdings gar nichts mehr.

Ich bin für jede Hilfe sehr dankbar.
 
Hallo, hier noch nähere Erläuterungen

auf der Formview erzeuge ich per Code Buttons. Alle Buttons sind gleich groß. Die Breite der Formview entspricht IMMER der Breite eines Buttons. Die Buttons liegen bündig untereinander. Die Höhe der Formview entspricht 'der Höhe eines Buttons*Anzahl aller Buttons'. (Die Formview zeigt also nur die Buttons.

Nun kann es während der Laufzeit vorkommen, dass nicht alle Buttons gebraucht werden. Deshalb verstecke ich dann die Buttons, die überflüssig sind. In diesem Fall soll sich dann die Höhe der Formview der aus 'der Höhe eines Buttons*Anzahl aller SICHTBAREN Buttons' ergeben (das ist unter anderem notwendig, damit eine überflüssige Scrollbar der Formview verschwindet).

Für alle die ICQ kennen: es ist eigentlich das selbe Prinzip wie das der Contact-List: übersteigt die 'Höhe*Anzahl der Contacts' die Höhe der Liste, so wird ein horizontaler Scrollbalken angezeigt. Veringert sich die Anzahl der sichtbaren Contacts wieder ('Höhe*Anzahl der Contacts' < Höhe der Contact-List), so verschwindet der horizontale Scrollbalken (d.h. die Höhe der Liste (in meinem Fall wäre das die Höhe der Formview) passt sich zur Laufzeit an).

Und so habe ich es bisher versucht:

int CMyFormView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
...

// Buttons erzeugen
...

// neue Höhe setzen, damit alle Buttons sichtbar sind
// (hier funktioniert es noch)
SetWindowPos(NULL,0,0,nKonstBreite,
nButtonHöhe*nButtonAnzahl,SWP_NOMOVE);

...
}

Nach Verstecken von Buttons rufe ich dann folgende Methode auf:

void CMyFormView::HöheAnpassen(nSichtbareBtns)
{
// hier stürzt er zwar nicht ab,
// es tut sich aber auch nichts an der Höhe
SetWindowPos(NULL,0,0,nKonstBreite,
nButtonHöhe*nSichtbareBtns,SWP_NOMOVE);
}
 
Hi,
da kann sich auch nichts tun. Welches Fenster willst du denn ändern? Das mußt du dem Betriebssystem auch mitteilen. Dazu brauchst du einen Pointer auf deine FormView. Dann kannst du mit
Code:
   MyFormView->SetWindowPos(........);
das Window verändern.

Mfg

langer
 
Hallo,

da ist offentsichlich etwas missverstanden worden:

Die Methoden, 'OnCreate' und 'HöheAnpassen' sind Methoden der Objekts, welches die Größe ändern soll (also die Formview). Dehalb brauche ich auch keinen Pointer. Allenfalls könnte man schreiben this->SetWindowPos(...), aber da spar ich mir einfach den this-Zeiger.
 
Hast du mal überprüft, ob SetWindowPos() richtig ausgeführt wird, d.h. der Rückgabewert ungleich 0 ist? Wenn du als ersten Parameter NULL nimmst, sollte meines Erachtens auch noch das Flag "SWP_NOZORDER" verwendet werden.

Gruß
MCoder
 
Hallo,

ich habe mir den Code gerade noch mal angeschaut. Komischerweise tut sich jetzt in der Methode

'void CMyFormView::HöheAnpassen(nSichtbareBtns)' (s.o.)

doch was: wenn ich mir in dieser Methode nach Aufruf von SetWindowPos(...) die Größe noch mal ausgeben lasse, dann hat diese auch den richtigen Wert. Allerdings sieht man davon nichts auf der Oberfläche. D.h. die Größe der Oberfläche behält auf dem Bildschirm die Einstellungen, die ich in der Methode 'OnCreate' gemacht habe.

'SWP_NOZORDER' und 'UpdateWindow()' bringen leider auch nichts. :(
 
Eine View hat immer die Größe des Client-Bereiches vom Frames. Eine Größenänderung muss daher für den Frame gemacht werden. Das ist aber, glaube ich, nicht das, was du willst.
Ich denke für dein Vorhaben ist die Steuerung der Scrollbar notwendig:
C++:
CRect rect;
GetClientRect(&rect);
SetScrollSizes(MM_TEXT, CSize(rect.Width(), nHeight)); // nHeight ist die 
                                                       // Höhe über alle Buttons
Gruß
MCoder
 
Zurück