以下黑色字體部分爲轉帖。
假設我們用CreateWindow(..., 0, 0, w, h, ...); 創建一個窗口, 我們將獲得一個w x h大小的窗口, 通常我們需要的是客戶區大小爲w x h,
如何做呢?
一個方法是調用API函數SetWindowPos, 通常我們需要提供3個參數:窗口句柄hwnd,窗口寬度w,窗口高度h。下面是一個示例:
SetWindowPos(hwnd, NULL, 0, 0, w, h, SWP_NOMOVE | SWP_NOZORDER);
現在的問題是我們只知道客戶區的大小w x h, 如何獲取窗口大小呢?
這裏的關鍵是
wWindow = wClient + wFrame * 2
hWindow = hClient + hCaption + hMenu + hFrame * 2
其中wFrame, hCaption, hMenu, hFrame取值則需要根據窗口樣式而定了。
如果窗口提供了Caption, 則hCaption=GetSystemMetrics(SM_CYCAPTION); 否則爲0
如果窗口提供了菜單, 則hMenu=GetSystemMetrics(SM_CYMENU); 否則爲0
如果窗口提供了Border, 則wFrame=GetSystemMetrics(SM_CXFRAME),hFrame=GetSystemMetrics(SM_CYFRAME); 否則爲0
綜合起來,如果窗口具有標題欄,具有菜單,具有border,我們可以這樣創建一個指定客戶區w x h大小的窗口:
CreateWindow(..., 0, 0, w, h, ...);
w = w + GetSystemMetrics(SM_CXFRAME) * 2;
h = h + GetSystemMetrics(SM_CYCAPTION) + GetSystemMetrics(SM_CYMENU) + GetSystemMetrics(SM_CYFRAME) * 2;
SetWindowPos(hwnd, NULL, 0, 0, w, h, SWP_NOMOVE | SWP_NOZORDER);
MFC的方法則更加簡單
在Create()或者CreateEx()創建窗口以後, 用下面的代碼調整窗口的大小。
CRect rect(0, 0, w, h);
CalcWindowRect(&rect);
SetWindowPos(NULL, 0, 0, rect.Width(), rect.Height(), SWP_NOMOVE | SWP_NOZORDER | SWP_NOREDRAW);
waterathena:
但是在我的工程裏面
wWindow = wClient + wFrame * 2
hWindow = hClient + hCaption + hMenu + hFrame * 2
這兩個公式覺得有問題。
我選擇的NON BORDER,然後利用公式的話怎麼都相差2個像素值。
日後若知道原因在補上。