最近處理了一個關於DPI的問題,想想挺有意思的,拿出來分享一下。先搞清楚一下幾個概念:
- DPI:dots per inch ,每英寸的點數。我們常說的滑鼠DPI,是指滑鼠移動一英寸的距離滑過的點數;列印DPI,每英寸的長度列印的點數;掃描DPI,每英寸掃描了多少個點。(更多請參考百度百科http://baike.baidu.com/view/49853.htm)
- 像素:pixel,picute和element的縮寫。像素可以簡單的理解為DPI裡面的點。例如,顯示器的解析度為1024像素*768像素,就是說顯示器的橫向可顯示1024個點(像素),縱向科研可以顯示768個點(像素)。有的顯示器每個顯示點排列的比較緊密,1英寸的長度內可以排列的點就多一些,有的排列比較疏鬆,點就少一些,所以像素和英寸之間是沒有直接的關係。(更多請參考百度百科http://baike.baidu.com/view/575.htm)
- 解析度:如上例,但是我們常說調整一下顯示器的解析度,是啥意思呢?顯示器有一個自然的解析度,就是顯示器的最大能耐,比如說,顯示器的自然解析度為1600*1200,那麼長度小於1600、寬度小於1200的解析度都可以顯示的,1900*1300這樣子的解析度就不行。
- Set Custom Text Size(DPI):WIN7這個DPI我個人覺得,和上述的DPI不是一回事,不知道為啥微軟把這個東東也叫DPI。首先,顯示裝置的物理DPI是不太可能改變的;其次,朋友們發現,這個DPI的預設值是96,也就是1英寸列印96個像素,當我們把DPI調整為125後,1英寸列印125個點。我們的大多數應用程式介面是按照96DPI設計的,到了125DPI後,1英寸的長度不再是1英寸,應該小一點,實際上,沒有變小,反而變大了,所以,我覺得和上述的dpi不是一回事,最起碼不是改變物理DPI。
然後仔細想想,類似於xp的放大鏡功能,而且提示是“Make it easier to read what is on your screen”,所以,我覺得,應該是這麼個意思,原來1英寸用96點來列印,您老人家覺得看不清楚,那我點之間的間距不變,用125個點來列印,這樣子列印出來,大於1英寸了,您老估計能看清楚了。
好了,言歸正傳,WPF 是這樣子處理的,他不管硬體是什麼樣的DPI,也不管作業系統是什麼樣的DPI,統統按照96DPI來計算,也就是說,WPF裡面的一個像素就等於1/96英寸。於是,問題似乎就出來了,在設計的時候,我們都是在96DPI下面進行的,到了客戶機器上後,千奇百怪的問題出現了,如下:
- 96DPI下,顯示器解析度為1024*768,應用程式的介面寬度為900,當到了125DPI的時候,傻眼了,介面被活生生的裁剪了一塊,尤其是絕對位置的情況。咋辦呢?給window設定MinHeight 和MinWidth ,讓這兩個值等於Height和Width。高DPI下,windows很過分,他發現他顯示不了介面的所有寬度後,儘力而為了,能顯示多少就弄多少,該裁剪的裁剪了,當設定了Minheight後,就相當於強制顯示,必須至少顯示這個尺寸,他就範了。
- 高DPI下,當前應用程式A與其他的應用程式B互動,B告訴A:在(600,500)的位置顯示,也就是命令A.Left=600,A.Top=500 ,B的這個尺寸是按照高dpi(例如125)計算出來的,是已經被放大過的。A是wpf程式,只認識96DPI,所以,A不能老老實實的按照這個點顯示,而是需要轉換一下:A.Left=600/(125/96),WPF重繪後,
windows再殷勤的放大一下,就吻合了B的要求。
- 高DPI下,wpf應用程式的寬和高的設定,類似於2中left和top的設定,需要做一下轉換。如果說需求是寬高隨著dpi自動放大,那就不用這樣子處理了。
- 字型的問題,win7 裡面DPI的方法,是為了字型更大一些,更容易看清楚來設計的。如果DPI很高,又要處理多國語言,有些語言翻譯後很長很長,字型有大,尺寸有限,這個時候,可能需要酌情轉換字型大小了。
以上純屬個人觀點,如果不正之處,敬請指正。