日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

关于WinForms的跨显示器DPI自适应

發布時間:2023/12/4 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关于WinForms的跨显示器DPI自适应 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

點擊上方藍字關注“汪宇杰博客”

導語

WinForms 是運行在Windows上的傳統.NET桌面應用技術框架。由于歷史原因,它對高DPI以及跨不同DPI屏幕的支持有些問題,本文將探索盡可能的解決方案。

Windows 的“黑歷史”

Windows 系統的默認DPI(更確切的說法叫 PPI)是96。PPI 的意思是 Pixels per inch,也就是每英寸屏幕顯示多少像素的意思。這個值越高,表示屏幕的顯示能力越細膩。

但也意味著,要顯示物理尺寸和低PPI屏幕相同的畫面,高PPI屏幕需要更多的像素來填充。對于一張非矢量圖來說,這個問題不好解決,由于向高像素拉伸,這個圖片會被“拉模糊”。類似的問題也發生在Windows中,特別是老程序,設計的時候只考慮了96 PPI。而這個歷史原因可以在微軟的這篇博客里找到詳解:

https://blogs.msdn.microsoft.com/fontblog/2005/11/08/where-does-96-dpi-come-from-in-windows/

例:在150% DPI的屏幕上,Windows管理控制臺(MMC)均會發生模糊。(可能在微信或網頁里不明顯)

而在100% DPI 的屏幕上,圖像是清晰的。

努力的 Windows 10

由于現在的電腦高分屏(HDPI)越來越多,Windows 10 每半年一次的 Feature Update 一直在努力解決 DPI 的問題。我們可以通過下圖的設置搭配,解決很多老程序的DPI適配。但是很難做到跨屏幕DPI自適應。

所謂跨屏幕DPI自適應(Per Monitor-DPI aware),意思就是當你的電腦有外接屏幕時,Windows會選擇適配該屏幕的DPI來顯示外接屏幕的圖像。這個DPI很可能和你電腦的主屏幕是不一樣的。例如,用 Surface Pro 外接一個 1920x1080 的22寸顯示器,那么Surface的主屏幕通常是 150%以上DPI,而外接顯示器是100%。

如果程序自己不支持 Per Monitor-DPI aware,那么你用Windows自帶的兼容模式調整完,會發現雖然兩個屏幕都是清晰的圖像,但是應用界面在低DPI屏幕上會被放大。并不完美。所以最地道的解決方式,是開發支持 Per Monitor-DPI aware 的程序。

微軟自己的應用也有這方面的改進。例如 Visual Studio 2019 開始已經天然支持 Per Monitor-DPI aware。(要求 Windows 10 v1803及.NET Framework 4.8)

WinForms 能搶救嗎

Windows桌面開發最native的三種技術分別是:WinForms、WPF、UWP。因為UWP誕生于現代,所以天生沒有DPI適配問題。而WPF的XAML界面也可以輕松適配DPI。唯獨 WinForms 歷史包袱太重,不改是不行的。我們來試試能否搶救。

首先,我在VS2019中使用150% DPI的主屏幕,設計器視圖不模糊,但按鈕尺寸有問題,控件位置如下:

留意紅色箭頭位置。在VS里一切正常。然而運行起來,在150% DPI的主屏幕是會模糊,并且控件錯位。

將窗口拖動到100% DPI的屏幕上,UI不模糊,但控件依舊錯位。

按照微軟官網文檔 https://docs.microsoft.com/en-us/dotnet/framework/winforms/high-dpi-support-in-windows-forms 的描述,.NET Framework 從4.7開始,改善WinForms的DPI支持。因此第一步,我將該程序的運行時改為4.7.2(Windows 10 1803以上版本自帶)

在應用根目錄加入一個 app.manifest 文件。

取消注釋其中的 assembly/compatibility/application 下的Windows 10 GUID。

<!-- Windows 10 -->

<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />

然后在 App.config 底下加入:

<System.Windows.Forms.ApplicationConfigurationSection>

? <add key="DpiAwareness" value="PerMonitorV2" />

</System.Windows.Forms.ApplicationConfigurationSection>

現在發現控件位置在150% DPI的主屏幕上正確顯示,整個UI不模糊。

但是在 100% DPI 的屏幕上,雖然UI不模糊,但是控件位置依然不正確,并且TextBox變的巨大無比。

微軟文檔里沒提別的方法。但是我發現將運行時改成.NET Framework 4.8 可以修復這個TextBox的爆,但是控件位置依然不正確。

經過仔細觀察,發生問題的并不是 TextBox、Label、Checkbox 這幾個控件,而是 MonthCalendar 在100% DPI的屏幕上比 150% 的主屏寬。并且 Panel、TableLayoutPanel和Dock的組合拳都沒法辦法解決這個問題。

.NET Core 3.0 能解決嗎?

.NET Core 3.0 目前還在preview 6階段。從我實驗的結果來看,它的DPI適配不需要App.config,而是在Program.cs里加入:

Application.SetHighDpiMode(HighDpiMode.PerMonitorV2);

但最終效果和以上的.NET Framework 4.8的效果是一樣的,雖然跨DPI屏幕界面不會模糊,但是 MonthCalendar 的寬度問題依舊。

結論

在 Windows 10 v1903 上(其他版本我沒試過),通過 .NET Framework 4.8 + app.manifest + app.config 的配置,可以一定程度上讓 WinForms 具有 Per Monitor-DPI aware 的能力,但是部分控件的尺寸還是會不一樣,因此發布程序之前需要仔細測試,保證UI可用性,再向用戶提供跨屏幕DPI自適應支持。

我的樣例程序代碼:https://github.com/EdiWang/DotNet-Samples/tree/master/WinForms-DPI-PMA/PerMonitorAwareDPIForms

總結

以上是生活随笔為你收集整理的关于WinForms的跨显示器DPI自适应的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。