Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/densen2014/winformhighdpicompatibleprogram
手把手教会 VS2022 设计 Winform 高DPI兼容程序 (net461 net6.0 双出)
https://github.com/densen2014/winformhighdpicompatibleprogram
Last synced: 11 days ago
JSON representation
手把手教会 VS2022 设计 Winform 高DPI兼容程序 (net461 net6.0 双出)
- Host: GitHub
- URL: https://github.com/densen2014/winformhighdpicompatibleprogram
- Owner: densen2014
- Created: 2022-04-13T22:34:30.000Z (over 2 years ago)
- Default Branch: master
- Last Pushed: 2022-04-13T23:04:42.000Z (over 2 years ago)
- Last Synced: 2024-10-05T05:20:57.760Z (about 1 month ago)
- Language: C#
- Homepage:
- Size: 55.7 KB
- Stars: 4
- Watchers: 2
- Forks: 2
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
## 本文主要解决两个问题
* C# Winform高DPI字体模糊.
* 高DPI下(缩放>100%), UI设计器一直提示缩放到100%, 如果不重启到100%,设计的控件会乱飞.![QQ截图20220413234355](https://user-images.githubusercontent.com/8428709/163275524-9bc8e8a8-68bc-44d2-adb8-15cdcdda00bb.png)
![QQ截图20220413234045](https://user-images.githubusercontent.com/8428709/163275119-f763b05e-8e3b-41b9-b8e6-ef4423e75be6.png)## 建立测试程序
1. 新建.Net Windows窗体应用 (Winform)工程
![1](https://user-images.githubusercontent.com/8428709/163266315-dbff89a8-7ae1-4309-8d0f-d6901597a703.png)
2. 选择.Net6.0
![2](https://user-images.githubusercontent.com/8428709/163266610-d118dd9a-19d4-4521-94e3-b78fa9d584a7.png)
3. 将窗体尺寸定为 1000 x 1000 , 用于后面检测缩放是否正确
![3](https://user-images.githubusercontent.com/8428709/163266621-0ebe0f55-a6b6-431f-a720-f456f59ff5c4.png)
4. 添加一个按钮 , 尺寸定为 150 x 50
![4](https://user-images.githubusercontent.com/8428709/163266653-de510ced-eb5d-4b71-81f7-56c8de189645.png)
5. 添加一个图片框 , 尺寸定为 300 x 300 , 右键导入一张图片
![5](https://user-images.githubusercontent.com/8428709/163266652-befe30dc-9af2-4755-8396-22ef043b6ec1.png)
![6](https://user-images.githubusercontent.com/8428709/163266647-b7fda41f-32ab-40e4-95e7-88801d145306.png)6. 添加测试代码
```
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
}}
}
```7. 运行看看效果: net6下运行,尺寸都是对的
![7](https://user-images.githubusercontent.com/8428709/163266645-90c8ca51-0a2d-4fe9-ac4f-40101042f181.png)
## 正式开始
1. 右键工程,添加应用程序清单 `app.manifest`, 文件名用默认,修改
![QQ截图20220413234934](https://user-images.githubusercontent.com/8428709/163276209-58e8968d-28ac-4405-9d3d-13bdc6915f2b.png)
取消这段的注释,打开感知 DPI
```
true
true
```2. 双击工程名称, 编辑配置文件,
`TargetFrameworks` 改为双目标框架 `net6.0-windows;net461;` , 保存后提示重载工程 , 最好是关闭vs再打开一次.
完整文件如下
```
WinExe
net6.0-windows;net461;
true
app.manifest
true
false
SystemAware
True
True
Resources.resx
ResXFileCodeGenerator
Resources.Designer.cs
```
3. 如果提示找不到控件, 在 Form1.Designer.cs 和 Form1.cs 添加
```
using System;
using System.Windows.Forms;
```4. `Program.cs`注释掉 `ApplicationConfiguration.Initialize();`
5. 运行选择 `net461`
_备注:我的屏幕是 2800 x 1800 ,缩放 175%_
![QQ截图20220414002554](https://user-images.githubusercontent.com/8428709/163280230-fa0c85ca-8684-498c-b456-ee1fc36c0a90.png)
果然, 显示尺寸不对
![QQ截图20220414002450](https://user-images.githubusercontent.com/8428709/163280144-76d3c1bb-4010-4c58-b3c8-a7d24fe603b2.png)
6. Form1.cs 添加 'AutoScaleMode = AutoScaleMode.Dpi;'
```
public Form1()
{
AutoScaleMode = AutoScaleMode.Dpi; //添加这句,要在'InitializeComponent();'上方
InitializeComponent();
}
```再次运行
![QQ截图20220414002857](https://user-images.githubusercontent.com/8428709/163280527-4ecc6a95-e12e-4a75-97e7-e1cd2faa7c90.png)
**完美!**
7. 双击编辑窗体,没有提示100%缩放, 添加标准菜单和DataGridView测试
![QQ截图20220414003217](https://user-images.githubusercontent.com/8428709/163280909-0494bf3b-e5a7-4503-b42c-d8187320a7a9.png)
**完美!双倍的快乐!**
## 总结
* 新建.Net Windows窗体应用 (Winform)工程 [.Net6.0]
* 添加应用程序清单 `app.manifest`, 打开感知 DPI
* `TargetFrameworks` 改为双目标框架 `net6.0-windows;net461;`
* `Program.cs`注释掉 `ApplicationConfiguration.Initialize();`
* `AutoScaleMode = AutoScaleMode.Dpi;` //添加这句,要在'InitializeComponent();'上方## 老工程也可以通过编辑projet文件升级到这种新工程格式,支持本文说的功能, 需要继续出教程的请在评论区留言, 这几天都在度假中, 今天就写到这里了. 下回见!