Fenster Logic
-
Du wird wohl aber ptMaxPosition nicht verändert - was du brauchst ist wohl eher das hier:
The parameters are given in screen coordinates for overlapped and pop-up windows and in parent-client coordinates for child windows.
The following example demonstrates how to obtain the position from the lParam parameter.
xPos = (int)(short) LOWORD(lParam); // horizontal position yPos = (int)(short) HIWORD(lParam); // vertical positionYou can also use the MAKEPOINTS macro to convert the lParam parameter to a POINTS structure.
mww schrieb:
P.S noch eine Frage: mit Enabelindow(hbutton,False) kann man ja buttons deaktivieren. Wie ist denn die ID vom Maximieren-Button ?
Falls du es gleich von Anfang an deaktivieren willst, dann darfst einfach WS_MAXIMIZEBOX nicht als Window-Style mit angeben bzw. mit (...) & ~WS_MAXIMIZEBOX explizit wieder entfernen

-
Das funktioniert auch nicht!
-
Dann hast du wohl etwas falsch gemacht

Wenn es beim Umschalten zwischen Max / normal nicht "rumhüpfen" soll, dann musst du natürlich sowohl ptMaxPosition, als auch rcNormalPosition entsprechend aktualisieren (und das auch nicht nur bei (wp.showCmd==SW_SHOWMAXIMIZED), denn du kannst ja das Fenster auch im nicht maximierten Modus verschieben (da musst du dann ptMaxPosition anpassen. Aber einfacher ist es, du lässt das Maximieren dann einfach erst gar nicht zu
-
Also ein letzter Versuch. Ich habe jetzt folgendes gemacht. So müßte es "Idiotensicher" sein. Aber es funzt auch hier nicht. Ich seh den Fehler nicht.
case WM_MOVE: cxScreen=LOWORD(lParam); cyScreen=HIWORD(lParam); GetWindowPlacement(hwnd, &wp); wp.ptMaxPosition.x=cxScreen; wp.ptMaxPosition.y=cyScreen; wp.rcNormalPosition.left=cxScreen; wp.rcNormalPosition.top=cyScreen; SetWindowPlacement(hwnd,&wp); return 0; case WM_SIZE: cxs = LOWORD(lParam); cys = HIWORD(lParam); SetWindowPos (hwnd, 0,cxScreen, cyScreen, 450 , 430,SW_SHOW ) ; ShowWindow(hwnd,SW_SHOW); UpdateWindow(hwnd); return 0;Danke an flenders

-
1.) rcNormalPosition hat nicht nur left und top
2.) sind cxScreen und cyScreen static?
3.) Was genau ist jetzt überhaupt dein Ziel
-
zu 2 Habe es mit static int und int probiert.
zu 3 mein Ziel ist,daß wenn ich das Fenster im maximierten Zustand bewege und dann auf den "verkleinern"-Button(Button zwischen Minimieren und Maximieren) gehe, daß es dann auf der momentanen Position verkleinert. Bis jetzt springt es aber auf eine andere PositionUmgekehrt funzt es. Es maximiert auf der gleichen Position
Danke noch mal für den Support
mww
-
Bei mir funktionier es so - hoffentlich hast du es auch so gemeint:
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { static int cxScreen; static int cyScreen; switch (message) { case WM_GETMINMAXINFO: { ((LPMINMAXINFO)lParam)->ptMaxPosition.x = cxScreen; ((LPMINMAXINFO)lParam)->ptMaxPosition.y = cyScreen; ((LPMINMAXINFO)lParam)->ptMaxTrackSize.x=430; ((LPMINMAXINFO)lParam)->ptMaxTrackSize.y=450; return 0; } case WM_MOVE: { RECT rcWindow; GetWindowRect(hwnd,&rcWindow); cxScreen = rcWindow.left; cyScreen = rcWindow.top; WINDOWPLACEMENT wp; wp.length = sizeof(WINDOWPLACEMENT); GetWindowPlacement(hwnd, &wp); if(wp.showCmd==SW_SHOWMAXIMIZED) { wp.rcNormalPosition.right = cxScreen + (wp.rcNormalPosition.right-wp.rcNormalPosition.left); wp.rcNormalPosition.bottom = cyScreen + (wp.rcNormalPosition.bottom-wp.rcNormalPosition.top); wp.rcNormalPosition.left = cxScreen; wp.rcNormalPosition.top = cyScreen; SetWindowPlacement(hwnd,&wp); } return 0; } // [...] } return DefWindowProc (hwnd, message, wParam, lParam); }
-
@flenders
100% ins Schwarze getroffen. Funktioniert perfektEin riesen Dank
mww
P.S Mir ist nur eins aufgefallen, wenn das Fenster im maximierten Zusatnd minimiert wird, erscheint es beim klick auf die Taskleiste nicht mehr )
-
Damit sollte auch dieser Fehler behoben sein:
if(!IsIconic(hwnd)) { RECT rcWindow; GetWindowRect(hwnd,&rcWindow); cxScreen = rcWindow.left; cyScreen = rcWindow.top; }
-
Fast perfekt

Wohin kommt dein Code in WM_SIZE ?
Edit: Hab´s .Alles paletti