VC GDI 像素轉釐米(英寸)[轉發]

【轉載】http://blog.sina.com.cn/s/blog_638dd78201018663.html


 


函數原型:int GetDeviceCaps(int nIndex);


常用的參數有(參考MSDN):


int iHORZSIZE=pDC->GetDeviceCaps(HORZSIZE); // 得到當前顯示設備的水平大小(毫米)


int iVERTSIZE=pDC->GetDeviceCaps(VERTSIZE);// 得到當前顯示設備的垂直大小(毫米)


int iHORZRES=pDC->GetDeviceCaps(HORZRES);// 得到當前顯示設備的水平像素數


int iVERTRES=pDC->GetDeviceCaps(VERTRES);// 得到當前顯示設備的垂直像素數


int iLOGPIXELSX=pDC->GetDeviceCaps(LOGPIXELSX);// 得到當前顯示設備的水平單位英寸像素數


int iLOGPIXELSY=pDC->GetDeviceCaps(LOGPIXELSY);// 得到當前顯示設備的垂直單位英寸像素數


int iPHYSICALWIDTH=pDC->GetDeviceCaps(PHYSICALWIDTH);// 得到當前打印設備的水平大小(毫米)


int iPHYSICALHEIGHT=pDC->GetDeviceCaps(PHYSICALHEIGHT);// 得到當前打印設備的水平大小(毫米)


 


驗證結果:


1.對於打印設備來說完全正確,可以利用上述參數在打印時得到與實際尺寸一致的結果。


2.對於打印設備來說上面的三組參數存在運算關係


iHORZSIZE=iHORZRES*25.4/iLOGPIXELSX;


iVERTSIZE=iVERTRES*25.4/iLOGPIXELSY;


3.對於顯示設備來說,LOGPIXELSX和LOGPIXELSY得到的結果和Windows設置的字體有關,100%時爲96dpi,150%時爲144dpi。


4.至少對我目前的筆記本顯示器來說,上述函數調用得到結果只有iHORZRES和iVERTRES是準確的,LOGPIXELSX和LOGPIXELSY爲96(我設置的是正常字體),而iHORZSIZE和iVERTSIZE似乎是用72dpi計算出來的:


iHORZSIZE=iHORZRES*25.4/72;


iVERTSIZE=iVERTRES*25.4/72;


不知這個72dpi從何而來


5.對我的筆記本顯示器,經驗證,改變分辨率和windows字體大小時,3和4的結論都正確,72dpi不變


6.PHYSICALWIDTH和PHYSICALHEIGHT這組參數,只對打印設備有效,得到是當前打印機紙張的全部像素數,而iHORZRES和iVERTRES得到的都是可打印範圍的像素數,對顯示設備這組參數返回值爲0


7.Google結果顯示可用讀註冊表中顯示器的EDID信息得到顯示器的物理尺寸,比較複雜,研究中
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章