2009-01-10 25 views
27
 
     ::GetSystemMetrics (SM_CYBORDER) 

... trở lại với 1 và tôi biết các thanh tiêu đề là cao hơn một pixel:/chiều rộng và chiều cao cửa sổ biên giới trong Win32 - làm cách nào để tải xuống?

Tôi cũng đã cố gắng:

 
    RECT r; 
     r.left = r.top = 0; r.right = r.bottom = 400; 
     ::AdjustWindowRect (& r, WS_OVERLAPPED, FALSE); 
     _bdW = (uword)(r.right - r.left - 400); 
     _bdH = (uword)(r.bottom - r.top - 400); 

Nhưng biên giới w, h trở lại là 0.

Trong trình xử lý WM_SIZE, tôi cần đảm bảo chiều cao của cửa sổ thay đổi trong "các bước", ví dụ: dòng văn bản hoàn toàn mới có thể vừa với cửa sổ không có "không gian dòng một phần junky" ở dưới cùng .

Nhưng :: MoveWindow cần kích thước VỚI không gian biên giới được thêm vào trong.

ai đó phải được thực hiện trước khi điều này ... Nhờ sự giúp đỡ :)

+0

Các tài liệu cho 'AdjustWindowRect' nói, khá là vô ích, rằng bạn không thể sử dụng 'WS_OVERLAPPED' với nó. – JWWalker

+0

@JWWalker: Trên thực tế, điều đó khá hữu ích. Bây giờ nếu bạn cũng biết rằng 'WS_OVERLAPPED' được định nghĩa là' 0x0', thì nó cũng phải rõ ràng, tại sao. – IInspectable

+0

@IInspectable, no, tôi không biết tại sao nó có liên quan là 'WS_OVERLAPPED' là 0. – JWWalker

Trả lời

38

Các chức năng GetWindowRectGetClientRect có thể được sử dụng để tính toán kích thước của tất cả đường viền cửa sổ.

Suite101 có một bài viết trên resizing a window and the keeping client area at a know size.

Đây là mẫu mã của họ:

void ClientResize(HWND hWnd, int nWidth, int nHeight) 
{ 
    RECT rcClient, rcWind; 
    POINT ptDiff; 
    GetClientRect(hWnd, &rcClient); 
    GetWindowRect(hWnd, &rcWind); 
    ptDiff.x = (rcWind.right - rcWind.left) - rcClient.right; 
    ptDiff.y = (rcWind.bottom - rcWind.top) - rcClient.bottom; 
    MoveWindow(hWnd,rcWind.left, rcWind.top, nWidth + ptDiff.x, nHeight + ptDiff.y, TRUE); 
} 
+2

Có chức năng WinAPI để thay đổi kích thước cửa sổ để có kích thước vùng khách hàng nhất định: AdjustWindowRectEx () – MrZebra

+1

Tôi nghĩ rằng tôi sẽ gắn bó với phương thức GetWindowRect() - GetClientRect(). Bằng cách đó, tôi không phải gây rối với phong cách cửa sổ từ heck. Đó là cùng một vấn đề tôi sẽ có với GetSystemMetrics (bất cứ điều gì) ... Cảm ơn tất cả mọi người - nơi này đá :) –

+0

Giải pháp này sẽ không hoạt động nếu cửa sổ được giảm thiểu do điều chỉnh kích thước cửa sổ –

9

Tôi nghĩ rằng những gì bạn đang tìm kiếm là SM_CYCAPTION - đó là chiều cao của thanh tiêu đề. SM_CYBORDER là chiều cao của cạnh ngang của cửa sổ.

+0

Hellow. Như [công cụ của captrue màn hình] của tôi (https://i.stack.imgur.com/Ikgeg.jpg), tôi biết chiều cao của thanh tiêu đề là 28. Nhưng 'GetSystemMetrics (SM_CYCAPTION)' của bạn chỉ cho '23'. – yode

+0

Phép đo đó có thể bao gồm các chỉ số khác, như đường viền cửa sổ. –

+0

Bạn có biết nó bao gồm componenets nào không? – yode

2

Đầu Geek đưa ra câu trả lời chi tiết: sử dụng GetSystemMetrics để thêm các chú thích và các bit biên giới. Bạn cũng có thể làm một sự khác biệt về chiều rộng/chiều cao giữa GetWindowRect và GetClientRect. Điều này sẽ cung cấp cho bạn tổng số phụ đề/biên giới/v.v.

+0

GetSystemMetics trên MSDN: http://msdn.microsoft.com/en-us/library/ms724385(VS.85).aspx – stukelly

10
int border_thickness = GetSystemMetrics(SM_CXSIZEFRAME); 

trên thực tế, kết quả trên là tương đương với:

GetClientRect(hWnd, &rcClient); 
GetWindowRect(hWnd, &rcWind); 
int border_thickness = ((rcWind.right - rcWind.left) - rcClient.right)/2; 

nhưng "GetSystemMetrics (SM_CXSIZEFRAME)" rất dễ dàng để được sử dụng.

2

Phương pháp được đề xuất bởi stukelly sẽ hoạt động trừ khi cửa sổ được thu nhỏ hoặc không hoàn toàn được khởi tạo. Một phương pháp thay thế sẽ cung cấp cho bạn kích thước đường viền trong các điều kiện này là sử dụng chức năng AdjustWindowRectEx. Dưới đây là một ví dụ:

CSize GetBorderSize(const CWnd& window) 
{ 
    // Determine the border size by asking windows to calculate the window rect 
    // required for a client rect with a width and height of 0 
    CRect rect; 
    AdjustWindowRectEx(&rect, window.GetStyle(), FALSE, window.GetExStyle()); 
    return rect.Size(); 
} 

Tùy thuộc vào ứng dụng, nó có thể là cần thiết để kết hợp phương pháp này với của stukelly nếu kích thước đường viền rõ ràng hiện nay là cần thiết:

CSize GetBorderSize(const CWnd& window) 
{ 
    if (window.IsZoomed()) 
    { 
     // The total border size is found by subtracting the size of the client rect 
     // from the size of the window rect. Note that when the window is zoomed, the 
     // borders are hidden, but the title bar is not. 
     CRect wndRect, clientRect; 
     window.GetWindowRect(&wndRect); 
     window.GetClientRect(&clientRect); 
     return wndRect.Size() - clientRect.Size(); 
    } 
    else 
    { 
     // Determine the border size by asking windows to calculate the window rect 
     // required for a client rect with a width and height of 0. This method will 
     // work before the window is fully initialized and when the window is minimized. 
     CRect rect; 
     AdjustWindowRectEx(&rect, window.GetStyle(), FALSE, window.GetExStyle()); 
     return rect.Size(); 
    } 
} 
Các vấn đề liên quan