如何調整窗口以適應客戶區大小

以下黑色字體部分爲轉帖。

假設我們用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個像素值。

日後若知道原因在補上。

發佈了139 篇原創文章 · 獲贊 3 · 訪問量 31萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章