手把手教會 VS2022 設計 Winform 高DPI相容程式 (net461 net6.0 雙出)

AlexChow發表於2022-04-14

本文主要解決兩個問題

  • C# Winform高DPI字型模糊.
  • 高DPI下(縮放>100%), UI設計器一直提示縮放到100%, 如果不重啟到100%,設計的控制元件會亂飛.

QQ截圖20220413234355
QQ截圖20220413234045

建立測試程式

  1. 新建.Net Windows窗體應用 (Winform)工程

1

  1. 選擇.Net6.0

2

  1. 將窗體尺寸定為 1000 x 1000 , 用於後面檢測縮放是否正確

3

  1. 新增一個按鈕 , 尺寸定為 150 x 50

4

  1. 新增一個圖片框 , 尺寸定為 300 x 300 , 右鍵匯入一張圖片

5
6

  1. 新增測試程式碼
namespace WinFormsApp1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            Text = this.Width + "x" + this.Height + " pic "+ pictureBox1.Width + "x" + pictureBox1.Height + 啟動環境(); 

        }

        public static string 啟動環境()
        {
#if NET461
            return (".NET Framework 4.6.1");
#elif NET6_0
            return (".NET6");
#endif  
        }

    }
}
  1. 執行看看效果: net6下執行,尺寸都是對的

7

正式開始

  1. 右鍵工程,新增應用程式清單 app.manifest, 檔名用預設,修改

QQ截圖20220413234934

取消這段的註釋,開啟感知 DPI

	<application xmlns="urn:schemas-microsoft-com:asm.v3">
		<windowsSettings>
			<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
			<longPathAware xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">true</longPathAware>
		</windowsSettings>
	</application>
  1. 雙擊工程名稱, 編輯配置檔案,

TargetFrameworks 改為雙目標框架 <TargetFrameworks>net6.0-windows;net461;</TargetFrameworks> , 儲存後提示過載工程 , 最好是關閉vs再開啟一次.

完整檔案如下

<Project Sdk="Microsoft.NET.Sdk">

	<PropertyGroup>
		<OutputType>WinExe</OutputType>
		<TargetFrameworks>net6.0-windows;net461;</TargetFrameworks>
		<UseWindowsForms>true</UseWindowsForms>
		<ApplicationManifest>app.manifest</ApplicationManifest>
		<ApplicationVisualStyles>true</ApplicationVisualStyles>
		<ApplicationUseCompatibleTextRendering>false</ApplicationUseCompatibleTextRendering>
		<ApplicationHighDpiMode>SystemAware</ApplicationHighDpiMode>
	</PropertyGroup>

	<ItemGroup>
		<Compile Update="Properties\Resources.Designer.cs">
			<DesignTime>True</DesignTime>
			<AutoGen>True</AutoGen>
			<DependentUpon>Resources.resx</DependentUpon>
		</Compile>
	</ItemGroup>

	<ItemGroup>
		<EmbeddedResource Update="Properties\Resources.resx">
			<Generator>ResXFileCodeGenerator</Generator>
			<LastGenOutput>Resources.Designer.cs</LastGenOutput>
		</EmbeddedResource>
	</ItemGroup>
</Project>
  1. 如果提示找不到控制元件, 在 Form1.Designer.cs 和 Form1.cs 新增
using System;
using System.Windows.Forms;
  1. Program.cs註釋掉 ApplicationConfiguration.Initialize();

  2. 執行選擇 net461

備註:我的螢幕是 2800 x 1800 ,縮放 175%

QQ截圖20220414002554

果然, 顯示尺寸不對

QQ截圖20220414002450

  1. Form1.cs 新增 'AutoScaleMode = AutoScaleMode.Dpi;'
public Form1()
{
    AutoScaleMode = AutoScaleMode.Dpi; //新增這句,要在'InitializeComponent();'上方
    InitializeComponent();
}

再次執行

QQ截圖20220414002857

完美!

  1. 雙擊編輯窗體,沒有提示100%縮放, 新增標準選單和DataGridView測試

QQ截圖20220414003217

完美!雙倍的快樂!

總結

  • 新建.Net Windows窗體應用 (Winform)工程 [.Net6.0]
  • 新增應用程式清單 app.manifest, 開啟感知 DPI
  • TargetFrameworks 改為雙目標框架 <TargetFrameworks>net6.0-windows;net461;</TargetFrameworks>
  • Program.cs註釋掉 ApplicationConfiguration.Initialize();
  • AutoScaleMode = AutoScaleMode.Dpi; //新增這句,要在'InitializeComponent();'上方

老工程也可以通過編輯projet檔案升級到這種新工程格式,支援本文說的功能, 需要繼續出教程的請在評論區留言, 這幾天都在度假中, 今天就寫到這裡了. 下回見!

配套DEMO

https://github.com/densen2014/WinformHighDPICompatibleProgram

https://gitee.com/alexchow/WinformHighDPICompatibleProgram

原文連結 https://www.cnblogs.com/densen2014/p/16142939.html

相關文章