MoveWindow dreht durch !?
-
Hallo Leute, ich hoffe ihr seid mir nicht sauer, aber zu Grafik/-Spiele-Programmierung wollte ich das bestimmmt nicht stecken:
Also ich möchte wie so oft bei Größenänderungen an meinem Dialog, dass die Controls sich ähnlich verhalten.z.B. Habe ich eine Listbox, und die soll sich anpassen.
Nun folgende Vorgehensweise.(einmal lädt der Dialog mit vorgegebenen werten).
if(!m_bInitialized) { return; } else { CRect rectDlg,rectCtrl,rectTarget; // Getting settings of the Dialog GetClientRect (&rectDlg); ClientToScreen (&rectDlg); lDlgLeft = rectDlg.left; lDlgRight = rectDlg.right; lDlgTop = rectDlg.top; lDlgBottom = rectDlg.bottom; lDlgHeight = rectDlg.Height(); lDlgWidth = rectDlg.Width (); // Getting settings of the Control if (::IsWindow(m_ctlLstEventsAvailable.m_hWnd)) { this->m_ctlLstEventsAvailable.GetWindowRect (&rectCtrl); rectTarget.top = (lDlgTop * m_dSizeFactorTop); rectTarget.left = (lDlgLeft * m_dSizeFactorTop); rectTarget.right =(lDlgRight * m_dSizeFactorRight); rectTarget.bottom = (lDlgBottom * m_dSizeFactorBottom ) ; m_ctlLstEventsAvailable.MoveWindow( &rectTarget,TRUE );Dadurch bekomme ich die folgenden Werte (die eigentlich wunderbar passen):
rectTarget {top=154 bottom=428 left=174 right=999}
rectDlg {top=104 bottom=829 left=117 right=1062}Sieht ja echt toll aus, aber in wirklich keit schwirrt mein Control jenseits von Gut und Böse auf dem Dialog rum.
Vielen Dank für eure Hilfe.
-
MoveWindow() setzt die Position relativ zum Elternfenster fest, d.h. der Punkt (0,0) ist die linke obere Ecke des Dialogs (also der Punkt (104,117) auf dem Bildschirm in deinem Beispiel) - das müsstest du noch ausgleichen.
-
Ok, dass wir das relativ zum Elternfenster verschieben hat mir schonmal geholfen. Vielleicht erkläre ich nochmal ganz kurz was ich (einfaches)
machen möchte:Ich habe einen dialog mit ListView, die soll von den Seitenrändern immer den gleichen Abstand haben.Also tacker ich die Listview oben mit zwei statischen werten fix an die linke obere ecke.
rect.left = LIST_LEFTBORDER; rect.top = LIST_TOPBORDER;Also relativ zum Dialog, beides = 16 (passt !)
Total easy, und funzt auch prima, jetzt macht mir nur noch unten und rechts Probleme:
Da nehme ich den RIGHT wert des Dialogs, und ziehe den gewünschten Abstand ab. Mathematisch korrekt, aber die Listview klebt immer noch an meiner rechten Seite. Ich kann den Wert sogar verdoppeln , NICHTS !
Unten genau so, ich dreh noch durch, jetzt stand ich so kurz vorm Durchbruch.
ISt alles in der OnInitDialog, falls das was ausmacht...
Danke
-
@dedidado: Mach bitte das Häkchen bei BBCode in diesem Beitrag deaktivieren weg, sonst funktionieren die Code-Tags nicht.
Am besten in deinem Profil, dann kannst du es nicht vergessen.
...ich habs jetzt schon zweimal nachgebessert.
Ich habe gerade mal bei mir geguckt (habe ein Formview mit einem Control drauf, was sich anpasst) und ich glaube, du hast ein Invalidate vergessen.
void CAdLogView::OnSize(UINT nType, int cx, int cy) { CFormView::OnSize(nType, cx, cy); if (m_lscLog.m_hWnd) { m_lscLog.MoveWindow(0, 50, cx, cy - 50); m_lscLog.Invalidate(); } } m_lscLog entspricht deinem m_ctlLstEventsAvailable. Und so funktioniert das einwandfrei. :)