最近處理了乙個關於dpi的問題,想想挺有意思的,拿出來分享一下。先搞清楚一下幾個概念:
dpi解析度:如上例,但是我們常說調整一下顯示器的解析度,是啥意思呢?顯示器有乙個自然的解析度,就是顯示器的最大能耐,比如說,顯示器的自然解析度為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很高,又要處理多國語言,有些語言翻譯後很長很長,字型有大,尺寸有限,這個時候,可能需要酌情轉換字型大小了。
以上純屬個人觀點,如果不正之處,敬請指正。
WPF 對應不同DPI時視窗位置調整
最近在做乙個專案,需要視窗依附於令乙個元素,顯示在他的上面,或者是下面。我這裡又不能用popup,只能用視窗了,所以呢,在100 dpi的時候,我的視窗顯示都沒有問題,但是當把dpi調成125 或者更高的時候,問題就來了。高dpi下,發現我的視窗不見了。有的時候會出來,但是移動它依附的元素的時候,視...
WPF 中Treeview 的效能問題
treeview 效能實在太差了.我需要在每個item前面加上乙個圖示,圖示是從系統裡面的來得,但是當資料量一大,就不行了.不知道怎麼回事,當我有個com 物件呼叫後 com 物件會執行乙個執行緒 cpu占有率就持續100 不知道怎麼回事.撤遠了.下面的連線,講了treeview的優化,三篇文章,應...
winform高DPI下縮放問題
winform在125 的情況下會造成兩個問題 設計器上設定的size與實際的size不對應 如 在設計器中設定窗體大小為1024,在高dpi下執行無問題,但改為100 顯示就低於1024大小 即size的屬性值也會跟著dpi進行調整 實際執行時,winform不相容問題,在100 下設計的介面,在...