顯示區域的大小

2021-06-22 00:56:02 字數 1662 閱讀 8465

顯示區域的大小

如果您使用過現有的windows應用程式,可能會發現視窗的尺寸變化極大。視窗最大化時(假定視窗只有標題列並且沒有選單),顯示區域幾乎佔據了整個螢幕。這一最大化了的顯示區域的尺寸可以通過以sm_cxfullscreen和sm_cyfullscreen為引數呼叫getsystemmetrics來獲得。視窗的最小尺寸可以很小,有時甚至不存在,更不用說顯示區域了。

在最近一章,我們使用getclientrect函式來取得顯示區域的大小。使用這個函式沒有什麼不好,但是在您每次要使用資訊時就去呼叫它一遍是沒有效率的。確定視窗顯示區域大小的更好方法是在視窗訊息處理程式中處理wm_size訊息。在視窗大小改變時,windows給視窗訊息處理程式傳送乙個wm_size訊息。

傳給視窗訊息處理程式的lparam引數的低字組中包含顯示區域的寬度,高字組中包含顯示區域的高度。要儲存這些尺寸,需要在視窗訊息處理程式中定義兩個靜態變數:

static int cxclient, cyclient ;

與cxchar和cychar相似,這兩個變數在視窗訊息處理程式內定義為靜態變數,因為在以後處理其它訊息時會用到它們。處理wm_size的方法如下:

casewm_size:

cxclient = loword (lparam) ;

cyclient = hiword (lparam) ;

return 0 ;

實際上您會在每個windows程式中看到類似的程式**。loword和hiword巨集在windows表頭檔案windef.h中定義。這些巨集的定義看起來像這樣:

#define loword(l) ((word)(l))

#define hiword(l) ((word)(((dword)(l) >> 16) & 0xffff))

這兩個巨集傳回word值(16位的無正負號整數,範圍從0到0xffff)。一般,將這些值儲存在32位有號整數中。這就不會牽扯到任何轉換問題,並使得這些值在以後需要的任何計算中易於使用。

在許多windows程式中,wm_size訊息必然跟著乙個wm_paint訊息。為什麼呢?因為在我們定義視窗類別時指定視窗類別樣式為:

cs_hredraw | cs_vredraw

這種視窗類別樣式告訴windows,如果水平或者垂直大小發生改變, 則強制更新顯示區域。

用如下公式計算可以在顯示區域內顯示的文字的總行數:

cyclient / cychar

如果顯示區域的高度太小以至無法顯示乙個完整的字元,這個公式的結果可以為0。類似地,在顯示區域的水平方向可以顯示的小寫字元的近似數目為:

cxclient / cxchar

如果在處理wm_create訊息處理期間取得cxchar和cychar,則不用擔心在這兩個計算公式中會出現被0除的情況。在winmain呼叫createwindow時,視窗訊息處理程式接收乙個wm_create訊息。在winmain呼叫showwindow之後接收到第乙個wm_create訊息,此時cxchar和cychar已經被賦予正的非零值了。

如果顯示區域的大小不足以容納所有的內容,那麼,知道視窗顯示區域的大小只是為使用者提供了在顯示區域內捲動文字的第一步。如果您對其他有類似需求的windows應用程式很熟悉,就很可能知道,這種情況下,我們需要使用「滾動條」。

SVG 顯示區域

svg就像一張無限大的畫布,需通過以下的屬性給它指定顯示區域,尺寸和座標系統之後才能顯示出我們需要的內容。viewport也叫視口,用來控制畫布區域的大小,主要通過width和height來指定。可以指定的單位包括 省略單位則預設使用pt。寬高各100px 寬高各100em viewport左上角的...

區域樹顯示區域(多級,多選,回顯)

name 杭州市 id 330100 name 麗水市 id 331100 name 浙江省 id 330000 渲染 html頁面,因為要做回顯,所以顯示資料的控制項放html頁面了 所屬區域 整顆樹由js渲染,包括樹的控制項 區域樹 author tu param id 要放在具體的div的id...

android 高亮顯示指定區域

國際慣例 首先熟悉兩點概念 聽著是不是感覺有點一樣,二者在window佔據全部screen時,返回值相等 不同的典型情況是在dialog中時。當dialog出現在螢幕中間時,view.getlocationonscreen 取得的值要比 view.getlocationinwindow 取得的值要大...