Fenster maximieren per HWND
-
Hallo winApi-Forum,
bitte - vorab - seht mir meine Fragen nach, bin komplett neu in winApi...
Ich schreibe ein cpp-Progrämmchen, das
a) den Desktop verkleinert und auch wiederherstellen kann (hab ich soweit)
und dann
b) alle offenen Fenster an den neuen Desktop anpassen soll (meine Frage...)im Moment setze ich alle sichtbaren Fenster auf die volle Größe mit
SetWindowPos(hwnd,HWND_BOTTOM, links, oben, breite,hoehe, SWP_SHOWWINDOW);
=> Leider springen die Fenster über den neuen rand bei Klick auf "verkleinern" bzw. "wiederherstellen"
=> Außerdem sind die Fenster nicht wirklich maximiert. Eben nur fast ganz.Meine Frage:
Gibt es eine WinApi-Funktion, mit der ich per WHND die sichtbaren Fenster so maximiere, wie es der Knopfdruck auf "maximieren" macht?Wie kann ich bei den offenen Fenastern die Maße auslesen, die sie gerade haben?
Vielen Dank für einen guten tip,
Gruß,
Juppi
-
ShowWindow(hWnd, SW_MAXIMIZE);
Für die Grösse: GetWindowRect bzw. GetClientRect.
-
juppi schrieb:
bitte - vorab - seht mir meine Fragen nach
schade
juppi schrieb:
Gibt es eine WinApi-Funktion, mit der ich per WHND die sichtbaren Fenster so maximiere, wie es der Knopfdruck auf "maximieren" macht?
dann sende doch die nachricht
SendMessage(hwnd, WM_SIZE, SIZE_MAXIMIZED, MAKELPARAM(nWidth, nHeight));
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/messagesandmessagequeues/messagesandmessagequeuesreference/messagesandmessagequeuesfunctions/sendmessage.asp
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/windows/windowreference/windowmessages/wm_size.aspjuppi schrieb:
Wie kann ich bei den offenen Fenastern die Maße auslesen, die sie gerade haben?
-
Danke für die Tips,
hab jetzt mit
if (rcw.top < lParam) SetWindowPos(hwnd,HWND_BOTTOM, rcw.left, lParam, rcw.right,rcw.bottom, SWP_SHOWWINDOW);
die Größen eingestellt.
ShowWindow(hWnd, SW_MAXIMIZE);
hats leider nicht gemacht, setzte alle Fenster auf volle Screengröße.
Trotzdem danke, manchmal hilft das Fragen schon, ums dann selbst zu finden...
Gruß,
Juppi
-
im groben hab iches soweit, nur 1 Problem krieg ich nicht hin:
Wenn ich nach dem Verkleinern des Desktop die Fenster per Klick auf "Verkleinern" (Systemknopf rechts oben) verkleinere, springt es gerne über meinen Rand hinweg.
D.h. das Fenster kennt noch nicht die neuen Ausmaße des Desktop.mit
SendMessage(hwnd, WM_SIZE, SIZE_MAXIMIZED, MAKELPARAM(nWidth, nHeight));
krieg ichs nicht hin, es zerschießt meine Prozedur, legt die Verkleinerung des Desktop lahm.
Also:
Wie sag ich dem Fenster die neuen Maße des Desktop?Danke für Eure Unterstützung.
Gruß,
Juppi
-
wie änderst du denn die auflösung ? zeig mal deinen code.
schau das mal mit dazu an
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sysinfo/base/systemparametersinfo.asp
+ SPI_SETWORKAREA
-
wie gesgt, SPI läuft
r.left = left; r.right = right; r.top = top; r.bottom = bottom; SystemParametersInfo(SPI_SETWORKAREA, 0, &r, SPIF_SENDCHANGE);
die sichtbaren Fenster passe ich auch an "von Hand"
SetWindowPos(hwnd,HWND_BOTTOM, rcw.left, oben, rcw.right, unten, SWP_SHOWWINDOW);
nur danach wissen die Fenster scheinbar nicht so richtig, daß sie nicht mehr über den neuen Rand springen dürfen.
-
jetzt fällt mir langsam nix mehr ein
hast du mal überprüft ob die es erfolgreich war?
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sysinfo/base/getsystemmetrics.aspänderst du auch die auflösung ?
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/devcons_7gz7.asp
-
warum sollte ich das tun?
die user würden es mir bestimmt auch übel nehmen...
-
juppi schrieb:
warum sollte ich das tun?
bezieht sich vermutlich auf die zweite frage, oder ?
ich habe dich gefragt eventuelle fehlerquellen zu beseitigen und um mehr über dein prog zu erfahren.
-
Es ist eben normal möglich Fenster über den Desktop-Rand hinaus zu vergrößern. Beim Wiederherstellen der Fenstergröße nach dem Maximieren werden eben wieder die alten Maße wiederhergestellt. Wenn dabei das Fenster unbedingt in den Desktopgrenzen bleiben soll musst du eben vorher das Fenster mit MoveWindow/SetWindowPos in der Größe entsprechend verkleinern und dann anschließend maximieren
-
GetWindowPlacement bzw. SetWindowPlacement
könnt da weiterhelfen:
In de 'WINDOWPLACEMENT' structur gib's das Feld:rcNormalPosition: Bestimmt die Koordinaten des Fensters, wenn es sich in der normalen (wiederhergestellten) Position befindet.