Steuerelemente ermitteln / Größe anpassen
-
GetWindow/GetNextWindow macht das.
http://msdn2.microsoft.com/en-us/library/ms633515(VS.85).aspx
http://msdn2.microsoft.com/en-us/library/ms633509(VS.85).aspx
-
Ich sehe noch nicht, wie ich die Steuerelemente in meiner Anwendung
mit GetWindow ermitteln soll. Werden damit nicht nur Haupt-Fenster ermittelt (das was ich im Taskmanager sehe)
-
Ich sehe erst jetzt was du meintest und versuche es zu verstehen:
CDialog::OnPaint(); CDialog::OnSize(nType, cx, cy); CEdit * ped=(CEdit *) GetDlgItem(IDC_EDIT1); if(!ped) return; CRect rect; GetClientRect(rect); //hier probiere ich noch rum...und brauche bitte eure Hilfe for (CWnd* pChild = GetWindow(GW_CHILD); pChild; pChild = pChild->GetNextWindow(GW_HWNDNEXT)) { pChild->MoveWindow(0,rect.bottom-rect.top-(rect.bottom-rect.top)/10,rect.right-rect.left,(rect.bottom-rect.top)/10); }Ich habe noch nicht raus, wie man richtig die Controls enumeriert.
Kann mir das jemand verraten?
-
Was ist Dein Problem?
-
Ich bin definitiv zu blöde zu ermitteln wie ich in Abhängigkeit
von der Dialoggröße meine Controls mit MoveWindow im Verhältnis
anpasse
-
ueberlade die funktion "OnSize" {WM_SIZE}
dort bekommst du die hoehe und breite des fensters uebergebenoder du holst dir die groesse des fenster mit
CRect rect;
this->GetWindowRect(&rect);
element.MoveWindow(10, 10, rect.Wide()/2, rect.Height()/2);nun ist das "element" von ganz links ganz oben bis zur mitte
in OnSize kannst du direkt mit cx und cy arbeiten und brauchst die groesse nicht holen
-
Hi, ich teste damit jetzt etwas herum.
Damit ich die Controls nur im Verhältnis mit vergrößer müsste ich
dann vermutlich die alte Dialggröße ermitteln und die %-Zahl der Vergrößerung
ermitteln. Wenn dann also 10% Vergrößert wurde, müsste ich in MoveWindow
bei den Parametern +10% hinzurechnen.Stimmt das so in etwa?
-
Dazu würde ich beim Start in OnInitDialog die originalen Größen speichern. In OnSize die entsprechende Rechnung durchführen und die Controls vergrößern.
Achtung: OnSize wird auch aufgerufen, wenn noch kein Control erzeugt wurde.
-
das achtung ist richtig
immer bei OnSizeif(element)
element.MoveWindowIch selber machs immer so das ich mir nicht merke wie gross das fenster vorher war, sondern ich mach immer sowas wie
cx / 2 - 160
oder soetwas in der art - dann ist es immer abhaengig zur derzeitigen groesse
-
Würde ich dann so in OnInit verfahren?
//postion des buttons merken: mybutton1->GetWindowRect(&rcButton); ScreenToClient(&rcButton); //original dialoggröße merken: GetClientRect(diarect);Dann müsste ich in OnSize wieder die gezogene neue Größe
nehmen (cx und cy) und von der Ursprungsgröße abziehen.
Das Ergebnis wäre meine Addition zur neuen Position, an der ich
meinen Button wieder mit MoveWindow() setze?!Oder war das Meilen daneben

-
Sry Mr Evil, hatte deinen Beitrag noch nicht gesehen.
Kannst du mir mal ein Beispiel posten, wenn es nicht zu viel
Umstände macht? Ich würde mich gern mal an einem funktionierenden
Snippet probieren und damit experimentieren. Die Treffer über
Google gehen weit über das hinaus, was ich bisher gelesen/gelernt habe.
-
www.simracing-factory.de/evil/SizeDemo.rar
Standard dialog-anwendung erstellt
meine aenderungen:
- drei list controlls gesetzt
- ok und cancel buttons entfernt
- variablen fuer die controlls erstellt
- code hinzugefuegt bei OnInitDialog
- OnSize ueberladen und dort code eingefuegtder fuer dich relevante teil ist in
//-------------------------------------------------------------------------------------------------
eingerahmtviel spass
-
Evil ich glaube sein Problem war, dass er die Berechnung nicht versteht.
Dein Beispiel gibt ja auch mehr oder weniger absolute Werte an!Wenn er die Elemente im Seitenverhältnis an der gleichen Stelle behalten
will und auch deren Größe im gleichen Maßstab mitändern will, wird man viel
mehr Aufwand betreiben müssen.Ich hab das Problem auch bei manchen kleinen Tools.Und zwar wird alles
bei einer Auflösung von 1024x768 relative groß dargestellt. Dann kommt ein
Spezi mit ner Auflösung die eine Stufe größer ist, und schon hat er nur noch
einen Minidialog aufm Schirm!Gibts dazu denn nicht schon fertige Klassen? In den Windows-Forms ist unten
rechts in der ecke standardmäßig ein schöner Resizepunkt eingebaut.
DAS wäre was cooles als Option in den MFC, wenn es sich auf die Controls auswirkt!
-
es sind mehr oder weniger absolute werte, welche sich aber an die bildschirmgroesse anpassen
zb sag ich 160 pixel kleiner als die halbe breite
wenn das fenster vergroessert wird, ist die halbe seite auch groesser, und dadurch das element ebensodas bedeutet: groesseres fenster = proportional groessere elemente - passt doch
Josche schrieb:
...rechts in der ecke standardmäßig ein schöner Resizepunkt eingebaut.
DAS wäre was cooles als Option in den MFC, wenn es sich auf die Controls auswirkt!
mein beispiel mal compiliert ? du wirst sehen das sich alle elemente dynamisch vergroessern wie das fenster ohne ein festen wert {o;