Erläuterung GetClientRect und GetWindowRect
-
Hallo,
Ich habe folgendes Problem.
Ich habe mehrer Dialoge und auf jedem ist ein EditFeld.
Ich möchte dieses nun größer machen. Dazu muß ich aber erstmal wissen wie größ der Dialog ist auf dem das EditFeld ist und wo es genau sitz. Wie bekomme ich nun diese Positionen heraus?
BOOL GetClientRect(HWND hWnd, LPRECT lpRect);
BOOL GetWindowRect(HWND hWnd, LPRECT lpRect);
Das mit dem Bool und dem Pointer(LPRECT) verstehe ich noch. Was muß ich aber bei HWND....eingeben?
Kann mir das einer erklären?
Gruß Rudi
-
HWND ist das Fenster, von dem Du diese Informationen erhalten willst (WINAPI).
Wenn Du MFC benutzt, dann brauchst Du HWND nicht zu übergeben, da die MFC die WINAPI kapselt und an dieser Stelle diesen Parameter übergibt.//WinAPI HWND hWnd = CreateWindow(...); RECT rc; GetClientRect( hWnd, &rc ); //MFC CWnd wnd; wnd.Create(...); CRect rc; wnd.GetClientRect( &rc );
-
Schau mal hier, da hab ich meinen Code gepostte mit dem ich
meine Elemente an die Fenstergröße anpasse:
http://www.c-plusplus.net/forum/viewtopic-var-t-is-120700.html
-
ich habe ein kleines EditFeld und möchte dieses bei einem Buttonklick auf eine bestimmte größe bekommen.
Wie bekomme ich die Größe / Position von dem EditFeld?
-
so kriegst du die Koordinaten von deinem EditFeld:
//Koordinaten in Gerätekoordinaten CRect rect; m_cEdit.GetWindowRect(rect); //Koordinaten in Clientkoordinaten CRect rect2; m_cEdit.GetClientRect(rect2);
über die Membervariablen von CRect kannst du dann auf die Koordinaten zugreifen
also z.b.:
rect.top
rect.bottom
rect.left
rect.right
-
Das heisst wenn ich die Größe des Editfelds ändern will mache ich das mit GetClientRect(....)
Oder?
-
Nein mit GetClientRect und GetWindowRect kriegst du nur die Position von deinem EditFeld raus.
Hier mal der Code den ich benutzen würde wenn ich ein EditFeld verschieben bzw die Größe verändern wollte;WINDOWPLACEMENT pl; m_cEdit.GetWindowPlacement(&pl); pl.rcNormalPosition.bottom = pl.rcNormalPosition.bottom+10; pl.rcNormalPosition.top = pl.rcNormalPosition.top+10; m_cEdit.SetWindowPlacement(&pl);
In diesem Fall verschiebt sich das EditFeld immer um 10 Pixel nach unten
mit den Membervariablen von
pl.rcNormalPosition
kriegst du ähnlich wie mit Get****Rect die Position des elements raus nur musst du sie dann nicht in einem CRect speichern.
Ausserdem sind dabei die Titelleiste usw glaub ich auch noch dabeiwillst du nur die Größe verändern musst du entsprechend andere variablen ändern
-
Taelan schrieb:
Nein mit GetClientRect und GetWindowRect kriegst du nur die Position von deinem EditFeld raus.
...stimmt nicht.
Wenn ich von dem Rechteck rechts - links berechne erhalte ich die Breite und unten - oben die Höhe!
-
Ja stimmt man kriegt auch noch andere werte wobei man nicht left-right rechnen muss um die Breite zu bekommen sondern einfach vom CRect die funktion Width() aufrufen kann.
Was ich meinte ist das man mit Get***Rect die Maße des Editfeldes nicht beeinflussen kann
-
Verstehe ich net.
Also ich habe just for fun mir mit GetClientRect die Position von meinem Edit feld geholt. Diese gespeichert. Die Position verändert und nun durch die "Originalen" wieder ersetz. - Doch das Edit feld sitz woanderst.
Das selbe speillchen auch mit GetWindowRect....
Es ist nicht nur woanderst plaziert sondern hat auch andere Ausmaße.
Was mache ich falsch?
-
kannst es auch einfach so machen:
m_myEdit.MoveWindow( xPos, yPos, breite, hoehe, TRUE );
-
Da bei mir die Geschichte mit GetWindowRect und SetWindowPos usw auch nicht vernünftig funktioniert hat und das EditFeld überall hingesprungen ist nur nicht dorthin wo ich wollt hab ich das ganze mit WINDOWPLACEMENT gelöst.
bei dem Fall mit GetWindowRect kann ich dir leider nicht helfen dir jedoch die andere Methode nur ans Herz legen. Damit hat sich das als recht einfach herausgestellt.
-
Was ich vielleicht vergessen habe zu sagen das ich das Editfeld mit SetWindowPos plaziere. Kann es daran liegen?
ICh bekomme doch mit GetWindowRect die genauen Positionen und man müßte mit diesen doch auch das Editfeld wieder palzieren können.