Wie erstellt man ein Window mit genauen Breiten und Höhen?
-
Ok, ok - so weit, so gut! Ich habe die Funktion AdjustWindowRectEx verwendet und es hat tatsächlich geklappt. Leider ist sie nicht universell. Denn:
The AdjustWindowRectEx function does not take the WS_VSCROLL or WS_HSCROLL styles into account. To account for the scroll bars, call the GetSystemMetrics function with SM_CXVSCROLL or SM_CYHSCROLL.
Wie soll jetzt die universelle Lösung aussehen?
-
Du musst 2. Get System metrics aufrufen:
RECT r1; AdjustWindowRect(WS_OVERLAPPEDWINDOW, &r1); // Wenn das fenster eine HScrollBar hat r1.bottom += GetSystemMetrics(SM_CYHSCROLL); // und bei VSCROLL r1.right += GetSystemMetrics(SM_CXVSCROLL);Das legst du natürlich beim erstellen des Fensters fest
-
Ich benutzte da immer schirrmie's Lösung, dabei hat man kein Gehample mit irgendwelchen Styles

-
Das mach ich auch so

Vorallem, wenn man z.B. die styles ändert. Außerdem hat die Funktion bei mir schon oft nicht richtig funktioniert obwohl ich den Style (mit WS_EX) angegeben habe und keine scroll bars hatte.
-
geeky schrieb:
Ich benutzte da immer schirrmie's Lösung, dabei hat man kein Gehample mit irgendwelchen Styles

Die sehe ich aber nirgendwo

-
Zdravko schrieb:
geeky schrieb:
Ich benutzte da immer schirrmie's Lösung, dabei hat man kein Gehample mit irgendwelchen Styles

Die sehe ich aber nirgendwo

Ich habe doch nur ein Post geschrieben da ist doch nicht so viel zu übersehen

Bei der Methode musst du halt selber rechnen. Guck dir die beiden Funktionen an und was diese tun. Mit ihnen erhählst du die höhe und breite vom gesamten Fenster und vom Child bereich dann kannst du die genauer höhe & breite ausrechnen wie du es brauchst.schirrmie
-
Also ist das auch völlig korrekt oder?
void create_win(const TCHAR* caption, UINT style, int w, int h, HWND parent) { RECT r; r.bottom = h; r.left = 0; r.right = w; r.top = 0; AdjustWindowRect(&r, style, false); hwnd_ = CreateWindow(cname_, // window class name caption, // window caption style, // window style 0, // initial x position 0, // initial y position r.right, // initial x size r.bottom, // initial y size parent, // parent window handle 0, // window menu handle h_, // program instance handle 0); // creation parameters
-
Dennis123 schrieb:
Du musst 2. Get System metrics aufrufen:
RECT r1; AdjustWindowRect(WS_OVERLAPPEDWINDOW, &r1); // Wenn das fenster eine HScrollBar hat r1.bottom += GetSystemMetrics(SM_CYHSCROLL); // und bei VSCROLL r1.right += GetSystemMetrics(SM_CXVSCROLL);Das legst du natürlich beim erstellen des Fensters fest
A nein! Das funzt einfach nicht. Siehe mal hier:
dwStyle
[in] Specifies the window style of the window whose required size is to be calculated. Note that you cannot specify the WS_OVERLAPPED style.Was mache ich dann????

-
Hehe, deswegen mag ich AdjustWindowRect() nicht

WS_OVERLAPPED ist quasi nen Kürzel für WS_FRAMEBORDER|WS_SYSMENU|WS_MINIMIZEBOX|WS_MAXIMIZEBOX oder sowas - Müsste in der msdn irgendwo stehen.Einfacher wäre sowas:
void AdjustMyWindow(HWND hWnd, int ClientWidth, int ClientHeight) { RECT clRt, wiRt; int diff_x, diff_y; GetClientRect(hWnd,&clRt); GetWindowRect(hWnd,&wiRt); diff_x=wiRt.right-wiRt.left-clRt.right; diff_y=wiRt.bottom-wiRt.top-clRt.bottom; MoveWindow(hWnd, wiRt.left, wiRt.top, diff_x+ClientWidth, diff_y+ClientHeight, true); }
-
geeky, danke - das hat geklappt! Aber du hast nicht gesagt wann man diese Funktion aufrufen kann.
In WM_SIZE: ja - das sollte gut laufen.
Nach ShowWindow/UpdateWindow - ist auch OK.