在Windows 7下,我使用以下代碼獲取屏幕毫米的物理寬度。 'hSize'是482,比實際尺寸大約310(用尺子測量)大得多。這是爲什麼?GetDeviceCaps獲取的物理屏幕尺寸不是我屏幕的實際物理尺寸
HDC screen = GetDC(NULL);
int hSize=GetDeviceCaps(screen,HORZSIZE);
PS:我需要DPI值來渲染地圖。
在Windows 7下,我使用以下代碼獲取屏幕毫米的物理寬度。 'hSize'是482,比實際尺寸大約310(用尺子測量)大得多。這是爲什麼?GetDeviceCaps獲取的物理屏幕尺寸不是我屏幕的實際物理尺寸
HDC screen = GetDC(NULL);
int hSize=GetDeviceCaps(screen,HORZSIZE);
PS:我需要DPI值來渲染地圖。
由於註釋表明GetDeviceCaps(HORSZIE/VERTSIZE)是非常不準確的。一直都是這樣,而且可能永遠都是這樣。沒有什麼可以做的,所以你只需假裝這個API不存在並繼續前進。它不會幫助您找到顯示器的實際大小。假設一個固定的默認值並讓用戶在必要時手動調整尺寸,您會更好。
幸運的是,有人已經完成了研究並找出了一種在Windows上查找顯示器物理大小的更好方法。在一篇名爲Reading Monitor Physical Dimensions, or: Getting the EDID, the Right Way的博客文章中,Ofek介紹瞭如何使用Windows的SetupAPI從montior的EDID獲得更精確的尺寸。
- 呼叫SetupDiGetClassDevsEx獲得一個HDEVINFO處理:該過程的概要描述如下。
- 在對SetupDiEnumDeviceInfo的調用中使用此HDEVINFO來填充SP_DEVINFO_DATA結構。
- 在對SetupDiOpenDevRegKey的調用中同時使用HDEVICE和HDEVINFO,最終得到一個HKEY到所需的註冊表項 - 保存EDID塊的那個。
鏈接的博客條目中包含的代碼示例,以及他嘗試過其他替代方法的信息。
請注意,即使EDID並不總是準確的。雖然顯示器本身所說的是它自己的尺寸,但仍然有很多錯誤的機會。供應商很容易在EDID中產生錯誤,而且顯示器仍然可以正常工作,所以沒有什麼動力去正確地獲取這些值。
只希望你不需要在多顯示器系統上做到這一點!我曾經有一臺顯示器的EDID很差,甚至沒有正確提供它的原始分辨率:http://superuser.com/questions/713487/getting-proper-resolution-with-windows-7-and-older -monitor –
作者的博客文章有關於如何在多監視器系統中檢索特定監視器的EDID的另一篇文章:http://ofekshilon.com/2014/06/19/reading-specific-monitor-dimensions/ –
'HORZSIZE'返回的值是基於配置的DPI和像素數的近似值。它意味着一個合乎邏輯的測量,而不是一個物理測量。它可能會相當數量,並且你無能爲力。 –
@MarkRansom說了什麼(我只是AOL)。 –
如果您需要DPI,只需要詢問:「LOGPIXELSX」和「LOGPIXELSY」被記錄爲給您這些值。 (除非我錯了,在這種情況下請隨時糾正我。) – andlabs