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

...回來了1,我知道標題欄比一個像素高:我也嘗試過/Win32窗口邊框寬度和高度 - 我如何得到它?

 
    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); 

但邊界W,H回來爲0。

在我的WM_SIZE處理程序中,我需要確保窗口的高度 「臺階」變化如此,例如文本的一個全新的行會適應窗口 沒有「毫無價值部分行空間」底部。

但::的MoveWindow需要的尺寸與添加的邊框空間。

一定有人做過這之前... 感謝所有幫助:)

+0

對於文檔`AdjustWindowRect`說,相當無益,你不能使用`WS_OVERLAPPED`。 – JWWalker 2012-02-01 20:31:04

+0

@JWWalker:其實這很有幫助。現在,如果你也知道'WS_OVERLAPPED'被定義爲'0x0',它應該很明顯,爲什麼。 – IInspectable 2017-11-15 22:34:39

+0

@IInspectable,不,我不知道爲什麼WS_OVERLAPPED是0是相關的。 – JWWalker 2017-11-16 16:19:39

回答

38

GetWindowRectGetClientRect函數可以用來計算所有窗口邊界的大小。

Suite101在resizing a window and the keeping client area at a know size上有一篇文章。

這裏是他們的示例代碼:

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); 
} 
9

我想你在找什麼是SM_CYCAPTION - 這是標題欄的高度。 SM_CYBORDER是窗口水平邊緣的高度。

+0

Hellow。作爲我的[screen captrue工具](https://i.stack.imgur.com/Ikgeg.jpg),我知道標題欄的高度是28.但是你的`GetSystemMetrics(SM_CYCAPTION)`只給出`23`。 。 – yode 2017-11-15 09:50:18

2

Head Geek給出了詳細的答案:使用GetSystemMetrics來添加標題和邊界位。你也可以在GetWindowRect和GetClientRect之間的寬度/高度上做一些改變。這會給你所有的標題/邊界/等。

10
int border_thickness = GetSystemMetrics(SM_CXSIZEFRAME); 

實際上,以上的結果是等於:

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

但 「GetSystemMetrics的(SM_CXSIZEFRAME)」 是容易被使用。

2

由stukelly建議的方法將工作,除非窗口最小化或未完全initialzied。在這些條件下給出邊界大小的另一種方法是使用AdjustWindowRectEx函數。這裏有一個例子:

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(); 
} 

根據應用的不同,它可能是必要的,如果當前可見的邊框尺寸是必要的這一做法與stukelly的結合:

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(); 
    } 
} 
相關問題