CDC::GetDeviceCaps()物理長度與屏幕像素間的轉換

作用:
讀取DC的一些打印區域信息,主要是像素和英寸方面的數據.

聲明:
GetDeviceCaps(int )

使用例子:
//所有像素數
int pagecx=dc.GetDeviceCaps(HORZRES);
int pagecy=dc.GetDeviceCaps(VERTRES);

//即每英寸點數
short cxInch = dc.GetDeviceCaps(LOGPIXELSX);
short cyInch = dc.GetDeviceCaps(LOGPIXELSY);

// 計算一個設備單位等於多少0.1mm
double scaleX = 254.0 / (double)GetDeviceCaps(dc.m_hAttribDC,LOGPIXELSX);
double scaleY = 254.0 / (double)GetDeviceCaps(dc.m_hAttribDC, LOGPIXELSY);


說明:
主要用到的參數見例子中的:HORZRES,VERTRES,LOGPIXELSX,LOGPIXELSY.總的來說是爲了方便控制打印或重畫時的控制,如爲了定製打印時,一般依據的是物理的長度,而不是像素,而DC一般是用像素的映射模式,所以需要一下轉換,上面這個函數就爲這種轉換設計的.

 

 

GDI中有一個函數是GetDeviceCaps(),可以獲取一些關於設備的一些屬性,如HORZSIZE/HORZRES/LOGPIXELSX等。
    以上三者的關係通常滿足:HORZSIZE = 25.4 * HORZRES/LOGPIXELSX
    HORZSIZE爲屏幕水平尺寸(定爲度量尺寸,以mm計),HORZRES爲水平的像素總數(定爲像素大小,平時所說的屏幕分辨率,但在這不這麼稱呼。這裏,分辨率定爲“每英寸的像素數”),LOGPIXELSX爲邏輯像素(假設的每英寸的像素數,並不是剛纔所說的實際的“分辨率”)。因此HORZSIZE也稱爲邏輯寬度
    當我們選擇“顯示”屬性裏的大字體時,LOGPIXELSX(通常分爲96dpi與120dpi)變大了,這樣假設原來的字體爲10磅,則原來的字體橫向所佔像素(實際所佔的像素數)爲10*(1/72)*LOGPIXELSX,現在LOGPIXELSX變大了,則字體所佔像素也大了,因此看起來字體大了。如果HORZRES不變的話,則HORZSIZE應該變小。然後這是和Windows有關的,在16位OS中,HORZSIZE值是固定的。
    在XP系統上驗證了一下,發現HORZSIZE值與LOGPIXELSX的值也是不變的,如果改變HORZRES的話,則HORZSIZE會發生相應變化,但LOGPIXELSX不變,一直是96。
    驗證數值是:當HORZRES/VERTRES分別爲800/600、1280/1024、1360/768時,LOGPIXELSX/LOGPIXELSY一直爲96,但HORZSIZE/VERTSIZE分別爲320/240、375/300、400/320。於是個人斷定:LOGPIXELSX/LOGPIXELSY與所選的字體(如TrueType)有關,windows默認的字體LOGPIXELSX/LOGPIXELSY值是定的,選大字體或小字體取它們的值都是一樣的,而一些字體是不同的。而HORZSIZE/VERTSIZE與系統版本有關,在有的系統中,這兩個值是適合此分辨率的標準顯示器的尺寸(定值,長寬比與分辨率的比一樣),不是通過公式計算的,也不等於公式計算的值;而有的系統版本這兩個值爲公式所得的值。
    下邊是petzold那本書上的兩句(沒摘英文的):“

然而,在Windows NT中,用老的方法定義HORZSIZE和VERTSIZE值。這種方法與Windows的16位版本一致。HORZRES和VERTRES值仍然表示水平和垂直圖素的數值,LOGPIXELSX和LOGPIXELSY仍然與在「控制檯」的「顯示器」程序中選擇的字體有關。在Windows 98中,LOGPIXELSX和LOGPIXELSY的典型值是96和120 dpi,這取決於您選擇的是小字體還是大字體。

在Windows NT中的區別是HORZSIZE和VERTSIZE值固定表示標準顯示器大小。對於普通的顯示卡,取得的HORZSIZE和VERTSIZE值分別是320和240毫米。這些值是相同的,與選擇的圖素大小無關。因此,這些值與用HORZRES、VERTRES、LOGPIXELSX和LOGPIXELSY索引從GetDeviceCaps中得到的值不同。然而,可以用前面的公式計算在Windows 98下的HORZSIZE和VERTSIZE值。

網上看到的,我對硬件設備的東西接觸的很少,上面的東西似乎還不太理解呵呵。要是有人很明白方便給分享一下哈!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章