c++ / WinApi: Resize von 2 Editboxen

Hallo.

Ich versuche 2 Editboxen in Abhängigkeit der Fenstergröße mit zu verkleinern/vergrößern. In der Datei im Anhang ist zu erkennen, dass beim öfterem Maximieren/Verkleinern die Textfelder immer kleiner bzw riesig groß. Ich krieg' diesen Bug einfach nicht raus.

Hier der Inhalt der Window-Procedure in der Message Loop: WM_SIZE:

Code:
			HWND hEdit1;
			HWND hEdit2;
                        RECT rcClient;
			RECT rcEdit1;
			RECT rcEdit2;
			
                        GetClientRect(hWnd, &rcClient);
			GetClientRect(hCODECHATONE, &rcEdit1);
			GetClientRect(hCODECHATTWO, &rcEdit2);
                        hEdit1 = GetDlgItem(hWnd, IDC_EDIT1);
			hEdit2 = GetDlgItem(hWnd, IDC_EDIT2);
			
			int iW1 = rcClient.right-(rcEdit2.right+100);
			int iW2 = rcClient.right-(rcEdit1.right+100);
			int iX2 = rcEdit1.right+100;
			int iH = rcClient.bottom-100;
			
			MoveWindow (hEdit1, 25, 25, iW1, iH, TRUE);
			MoveWindow (hEdit2, iX2, 25, iW2, iH, TRUE);

Wäre nett, wenn Ihr mir helfen könntet.
8)
 
Möglicherweise solltest Du auf WM_SIZE in Abhängigkeit von fwSizeType reagieren und auch mal nWidth und nHeight ausgeben lassen:

WM_SIZE
fwSizeType = wParam;

Parameters
fwSizeType
Value of wParam. Specifies the type of resizing requested. This parameter can be one of the following values:

Value Meaning
SIZE_MAXHIDE Message is sent to all pop-up windows when some other window is maximized.
SIZE_MAXIMIZED Window has been maximized.
SIZE_MAXSHOW Message is sent to all pop-up windows when some other window has been restored to its former size.
SIZE_MINIMIZED Window has been minimized.
SIZE_RESTORED Window has been resized, but neither the SIZE_MINIMIZED nor SIZE_MAXIMIZED value applies.

EDIT: Ich glaube, der Fehler liegt darin, daß Du die alte Größe der Editboxen in die Berechnung einbeziehst. Ist hCODECHATONE == hEdit1?
 
Ich gehe auch mal davon aus, dass
hCODECHATONE 'altes' Fensterhandle von hEdit1
hCODECHATTWO 'altes' Fensterhandle von hEdit2
sein sollen.

@eqw0uL
Wenn du dann mit
hEdit1 = GetDlgItem(hWnd, IDC_EDIT1);
das Fensterhandle holst, steht dort dann natürlich der gleiche Wert wie in hCODECHATONE, was bei deiner Berechnung nur in die 'Hose' gehen kann.

Soweit ich das an deiner Demo sehen kann, sollen wohl beide EditFenster die gleiche Größe haben.
Warum also so kompliziert. Du hast - wenn ich das richtig erkannt habe - einen fest definierten Punkt (left = 25, top = 25) an dem sich das erste EditFenster auf dem Hauptfenster befinden soll, sowie eine fest definierten Abstand (100) zwischen den EditFenstern.
Ausserdem ist die Funktion
GetClientRect(hWnd, &rcClient);
hier überflüssig. Du bekommst die Dimension des ClientFensters aus dem lParam (siehe MSDN).
Code:
// folgende Werte nur als Beispiel
int lr = 25; // linker Rand
int or = 25; // oberer Rand
int rr = 25; // rechter Rand
int ur = 25; // unterer Rand
int zw = 100; // zwischenraum

// 'Leerräume' von der Clientbreite abziehen (übrig bleibt nutzbarer 'Raum' für die EditFenster),
// und dann noch den nutzbaren Raum auf beide Editfenster verteilen (/ 2);
int breite = ((int)LOWORD(lParam) - lr - rr - zw) / 2;
int hoehe = (int)HIWORD(lParam) - or - ur;

// Alternativ zu MoveWindow, kannst du auch SetWindowPos verwenden
MoveWindow (GetDlgItem(hWnd, IDC_EDIT1),  lr, or, breite, hoehe, TRUE);
MoveWindow (GetDlgItem(hWnd, IDC_EDIT2),  lr + zw + breite, or, breite, hoehe, TRUE);
PS: Hast du dir schonmal überlegt, für ein Chatprogramm eine plattformübergreifende Programmiersprache (z.B. Java, Python) zu verwenden.
 
danke für eure hilfe

c++api: ich lerne java in der Schule und irgendwie halte ich nicht viel davon. Ich werde versuchen es mit C und einer plattformunabhängigen api zu machen, ich glaube da gibt es qt und gtk. Vielleicht könnt ihr mir ein paar Gute nennen ;)

so long, eqw0uL
 
Zurück
Oben