手把手教会VS2022设计Winform高DPI兼容程序(net461net6.0双出)

博客 分享
0 206
张三
张三 2022-04-14 06:57:56
悬赏:0 积分 收藏

手把手教会 VS2022 设计 Winform 高DPI兼容程序 (net461 net6.0 双出)

手把手教会 VS2022 设计 Winform 高DPI兼容程序 (net461  net6.0 双出) 本文主要解决两个问题* C# Winform高DPI字体模糊.* 高DPI下(缩放>100%), UI设计器一直提示缩放到100%, 如果不重启到100%,设计的控件会乱飞.

本文主要解决两个问题

  • 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();

老工程也可以通过编辑projet文件升级到这种新工程格式,支持本文说的功能, 需要继续出教程的请在评论区留言, 这几天都在度假中, 今天就写到这里了. 下回见!

配套DEMO

https://github.com/densen2014/WinformHighDPICompatibleProgram

https://gitee.com/alexchow/WinformHighDPICompatibleProgram

原文链接 https://www.cnblogs.com/densen2014/p/16142939.html

posted @ 2022-04-14 06:50 AlexChow 阅读(0) 评论(0) 编辑 收藏 举报
回帖
    张三

    张三 (王者 段位)

    821 积分 (2)粉丝 (41)源码

     

    温馨提示

    亦奇源码

    最新会员