Wie erstellt man ein Window mit genauen Breiten und Höhen?



  • AdjustWindowRect (bzw die Ex-Version) ist dafür eigentlich vorgesehen 👍 .



  • Wie macht man denn das? Es soll irgendwie während der Initialisierung des Windows geschehen. 💡



  • 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.


Anmelden zum Antworten