DPI適配之理論篇


本文介紹在DPI適配中的一些原理性知識,為下一篇實踐篇打下基礎。文章主要內容來源MSDN以及相關博客,

DPI是什么

DPIdots 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被引入,在Win7Win8Win8.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有以下處理情況:

  1. 應用在高DPI下運作正常,並通知系統自身支持。應用清晰顯示,行為正確。
  2. 應用在高DPI下運作正常,未通知系統自身支持。系統會縮放窗口,顯示模糊但行為正確。
  3. 應用不支持高DPI,卻錯誤通知系統自身支持:程序界面顯示錯位或者大小不正確。
  4. 應用不支持高DPI,未通知系統自身支持:系統會縮放窗口,窗口顯示模糊,無錯位。因為應用看到了"縮小"的屏幕分辨率。

Win10縮放機制

Win10的DPI縮放機制針對所有DPI縮放級別均采用DPI虛擬化機制,保證界面正常。針對DPI檔位,固定為以下幾種類別: 100%, 125%, 150%, 175%, 200%,225%,250%, 300%。

確定應用程序支持DPI縮放級別

下載並運行Sysinternals 進程瀏覽器,處理資源管理器,點擊列,查看"DPI識別"列即可。

參考文章:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM