Steuerelementposition verändern
-
Hi,
ich möchte einen Button im Dialogfeld positionieren. Wie mache ich das? Habe nichts gefunden dazu.Hintergrund: Es wird ein Dialogfeld maximiert geöffnet und das Steuerelement muß sich halt daran anpassen, da ich es ja vorher nicht so positionieren kann.
Bitte Hilfe
-
Du könntest z.B. eine RECT - Struktur erstellen, da dann oben, unten, links und rechts drin angeben und dann den Button mit
GetDlgItem(IDC_BUTTON)->MoveWindow(&rect);
positionieren. Wenn du noch mehr Steuerelemente hast, könnte dich auch der entsprechende Beitrag in den FAQ interessieren, da issn weiterführender Link zu einer Klasse.
http://www.c-plusplus.net/forum/viewtopic-var-t-is-39118.html
-
Danke für die Hilfe. Ist bestimmt das richtige für mich.
Ich verstehe bloß nicht, daß man beim suchen, so etwas einfach nicht findet!!
-
Das mit dem "MoveWindow" funktioniert soweit. Jetzt habe ich aber das Problem, daß es sich bei Normaldarstellung (also nicht Maximiert) nicht neu zeichnet.
Ich hatte OnPaint() eingefügt, damit es sich beim minimieren auch anpasst. Macht es aber leider nicht.
Ich glaube das Rechteck vom Dialog ist nicht das Richtige.
Ich weiß jetzt auch nicht so richtig, wie ich mich ausdrücken soll. Vielleicht habt ihr das ja verstanden (Der Dialog ist nicht der Hauptdialog)P.S.: Die Klasse scheint zwar gut zu sein, ist mir aber jetzt einfach zuviel.
-
Reagiere doch einfach auf WM_SYSCOMMAND und dort auf SC_MAXIMIZE bzw. SC_RESTORE.
In der OnPaint brauchst Du dich damit eigentlich nicht rumschlagen.Edit: Achso, ich glaub ich hab Dich falsch verstanden, OnPaint() darf nie direkt aufgerufen werden. Den Aufruf erzwingt man durch Invalidate()
-
connan schrieb:
Edit: Achso, ich glaub ich hab Dich falsch verstanden, OnPaint() darf nie direkt aufgerufen werden. Den Aufruf erzwingt man durch Invalidate()
Wann muß ich denn Invalidate() aufrufen? In der OnPaint()-Methode?
-
Nein, Invalidate() sorgt für ein Neuzeichnen. Markiert das Fenster sozusagen für die nächste Nachricht WM_PAINT als überarbeitenswert.
Wenn Du diese Nachricht gleich selbst erzwingen willst:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vcmfc98/html/_mfc_cwnd.3a3a.updatewindow.asp
-
Ja das ist mir eigentlich auch klar. Ich habe doch aber einen zweiten Dialog in dem in OnInitDialog das Positionieren des Steuerelements drin steht. Sonst ist da ja nichts weiter. Und jetzt war die Frage, wie ich das jetzt beim normalisieren des Dialogs (vom Maximierten Fenster in das normale Fenster) wieder aufrufe.
-
Hi!
Vielleicht hilft Dir das auch weiter?
http://www.codeproject.com/dialog/RPResizeDlg.aspDie Klasse verwende ich nur noch wenn ich Dialoge mache bei
denen die Steuerelemente angepaßt werden sollen.
-
Du kannst OnInitDialog nicht ein zweites mal aufrufen. Lagere doch die Positionierung in eine Funktion aus, die kannst du dann in OnInit.. und beim Wiederherstellen aufrufen.
-
Ja und das ist jetzt wieder die Frage welche Meldung ist den das, das Wiederherstellen????
Wie gesagt, daß ist ein Modaler Unterdialog des Hauptdialogs.
Übrigens habe ich mal die Dialogklassen der zwei links versucht. Da gibt es aber überall kleinere Bugs, Schade!
-
connan schrieb:
Reagiere doch einfach auf WM_SYSCOMMAND und dort auf SC_MAXIMIZE bzw. SC_RESTORE.
-
Hatte ich schon wieder überlesen, danke. werde ich gleich mal ausprobieren.
-
Jetzt habe ich aber noch ein Problem:
Das Steuerelement wird jetzt erst gezeichnet wenn ich das Fenster bewege.
Wie kann ich das gleich bewerkstelligen?
-
Erhard Henkes schrieb:
Nein, Invalidate() sorgt für ein Neuzeichnen. Markiert das Fenster sozusagen für die nächste Nachricht WM_PAINT als überarbeitenswert.
Wenn Du diese Nachricht gleich selbst erzwingen willst:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vcmfc98/html/_mfc_cwnd.3a3a.updatewindow.asp
-
OK, jetzt funktioniert das soweit. Also Maximieren, wiederherstellen, Minimieren. Und sogar wenn ich das Fenster mit der Maus vergrößere.
Jetzt ist aber das Problem, daß wenn ich das Fenster soweit verkleinere, daß das Steuerelement nicht mehr zu sehen ist, muß ich wieder das Fenster bewegen, um das Steuerelement zu sehen.Da ist doch noch irgendwas nicht ganz richtig.
Edit: alles klar, habe das jetzt endlich hinbekommen, natürlich noch OnSize und dann Invalidate()
Vielen Dank für die vielen Antworten!!!!