本文介紹在DPI適配中的一些原理性知識,為下一篇實踐篇打下基礎。文章主要內容來源MSDN以及相關博客,
DPI是什么
DPI
是dots per inch
的英文簡稱,表示顯示器固定區域內的像素密度,是邏輯單位。隨着顯示設備的進步,在高分辨率顯示屏上顯示的內容會越來越多,增大DPI選項,可更改屏幕上的文本大小以及其他項,優化顯示效果。
DPI
縮放比例和屏幕分辨率是兩個獨立的屬性,可獨立設置。但它們之間有制約,在特定分辨率下,只允許縮放指定DPI比例,一般來說,更大的分辨率,支持更多的縮放級別。
默認DPI
縮放比例為100%(96),即10點大小的宋體文字分辨率是每英寸顯示96像素點。如果比例改為125%,同樣大小的字體,每英寸長度顯示120像素(96*1.25=120),看起來顯示變大了。
高DPI適用場景:
- 多顯示器情況,每個顯示器有不同的DPI縮放因子和分辨率
- 將高DPI顯示設備在外接低DPI顯示屏上,或者相反
屏幕分辨率
顯示設備的分辨率定義了屏幕上顯示的像素數量,比如,27寸顯示器的分辨率是2560*1440px,表示它的寬有2560個像素,高有1440像素。針對物理顯示尺寸,有最佳分辨率,分辨率可以調整,同樣分辨率的顯示,它能跟牆一般大,也可以跟手掌一樣小。
在相同DPI下,如果減少分辨率,那每個像素點占據的空間會變大,操作系統會自動拉伸像素來填充。
傳統縮放機制
傳統縮放機制被Windows XP所采用,操作系統會按照設置DPI對應用進行縮放,由開發者自行檢查縮放后是否存在問題。
- 優點字體清晰
- 處理不好會出現排版錯亂,文本框重疊,文字溢出,界面越界等
現代縮放機制
現代縮放機制又稱為DPI虛擬化,進一步細化不同縮放比例的處理,不讓老程序在高DPI下出現界面錯位。
- DPI縮放比例不超過125%,使用傳統DPI縮放機制
- 超過125%縮放比例
- 程序報告支持自適應DPI:系統停用DPI縮放,縮放交由程序自身管理。
- 未報告自適應DPI,即非DPI-Aware程序:
- 整數倍縮放,如200%,300%,將原有界面中的1點擴展為4點/9點
- 非整數倍縮放,如150%,175%等, 系統會先向應用提交縮放前的分辨率,由系統按照該比例進行渲染,然后通過圖像插值放大到指定DPI級別。
例如:原始分辨率為19201080,按150%比例縮放,那呈現給應用的是1280720分辨率進行渲染,應用看到的分辨率降低了,具體計算方式如下:1920/150% = 1280, 1080/150% = 720,再用常規圖像插值算法進行放大,插值算法會導致界面模糊,顯示鋸齒等問題。
該機制從Vista被引入,在Win7
、Win8
、Win8.1
上都有采用。
默認情況下,WIndows認為應用程序是DPI-unAware,應用程序通知系統支持高DPI有以下三種方式:
- 方式一:在主進程的manifest中寫入信息,如下配置:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<application xmlns="urn:schemas-microsoft-com:asm.v3">
<windowsSettings>
<dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitorV2</dpiAwareness>
<dpiAware>true</dpiAware>
</windowsSettings>
</application>
</assembly>
具體參考鏈接:Setting the default DPI awareness for a process
- 方式二:使用SetProcessDpiAwareness函數,設定DPI支持程度
- Process_DPI_Unaware: 不支持高DPI,由系統來負責縮放
- Process_System_DPI_Aware: 支持主屏幕高DPI,不支持多屏幕下的不同DPI
- Process_Pre_Monitor_DPI_Aware:支持不同屏幕不同DPI縮放
注意,在Win8系統上有SetProcessDPIAware,該API在之后新版本被廢棄。在Win8.1以及Win10上應該使用SetProcessDpiAwareness,
- 方式三:通過啟動程序右鍵快捷方式中開啟"在高DPI下禁用界面縮放"。設置該項,表明應用向系統通知自身支持高DPI,不建議這樣來操作。
第三方應用程序針對DPI有以下處理情況:
- 應用在高DPI下運作正常,並通知系統自身支持。應用清晰顯示,行為正確。
- 應用在高DPI下運作正常,未通知系統自身支持。系統會縮放窗口,顯示模糊但行為正確。
- 應用不支持高DPI,卻錯誤通知系統自身支持:程序界面顯示錯位或者大小不正確。
- 應用不支持高DPI,未通知系統自身支持:系統會縮放窗口,窗口顯示模糊,無錯位。因為應用看到了"縮小"的屏幕分辨率。
Win10縮放機制
Win10的DPI縮放機制針對所有DPI縮放級別均采用DPI虛擬化機制,保證界面正常。針對DPI檔位,固定為以下幾種類別: 100%, 125%, 150%, 175%, 200%,225%,250%, 300%。
確定應用程序支持DPI縮放級別
下載並運行Sysinternals 進程瀏覽器,處理資源管理器,點擊列,查看"DPI識別"列即可。
參考文章: