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

2021-04-24 08:35:30 字數 1510 閱讀 8746

以下黑色字型部分為**。

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

日後若知道原因在補上。

程式如何適應所有的難產客戶

原則 1.技術範圍之內 2.適用於盡可能多的難產客戶 第一步 分析客戶的需求要有調理性 不要盲目的去整理客戶的所有需求。首先知道客戶的整體需求就行。然後給出他一套程式的設計思路。當然是在遵循原則的前提下。讓客戶去補充這個設計。第二步 出設計方案 設計方案可以在滿足客戶的需求的前提下,增加些自己的東西...

畫布Canvas自適應瀏覽器視窗調整寬高

讓畫布自適應瀏覽器視窗調整寬高可以利用window物件的onresize事件屬性,當瀏覽器視窗發生大小調整時會觸發此事件。注意在css樣式中應當清除外邊距和內邊距的瀏覽器預設樣式,同時將canvas的display屬性設定為 block 此方法的目的是為了在調整瀏覽器視窗的時候頁面不出現滾動條,在利...

jqgrid自適應調整寬度時如何顯示水平滾動條

最近開發專案的過程中,遇到了調整jqgrid 的問題,專案前端框架用bootstrap進行開發,想適配任何大小的螢幕,但在調整寬度的時候發現無法通過水平滾動條來檢視顯示不出來的字段資訊,強制設定了滾動條的樣式發現不起作用,如下圖所示。後通過瀏覽器自帶的審查元素檢視器發現設定樣式的位置不太正確,這樣是...