问题描述
建议:如果是刚开始写WinForm项目 ,建议刚开始就去进行一个替换 ,要不然后面会很麻烦的 ,不仅要计算size 还要去 计算 location 的值
昨天碰到了这个问题 ,当时设置完之后界面就非常的模糊 ,虽然说界面变大了 ,但是看着异常难受 ,很模糊
解决方案
-
新建
应用程序清单文件(Application Manifest File)
, 保持默认名称app.manifest
,点击添加。 -
找到这段代码:
<application xmlns="urn:schemas-microsoft-com:asm.v3"><windowsSettings><dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware></windowsSettings> </application>
-
替换DPI相关配置:
<application xmlns="urn:schemas-microsoft-com:asm.v3"><windowsSettings><dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true/pm</dpiAware><!-- Windows 10 1703+ 支持 Per-Monitor v2 --><dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">permonitorv2,permonitor</dpiAwareness><longPathAware xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">true</longPathAware> <!-- 保留长路径支持(如果需要) --></windowsSettings> </application>
-
保存文件,重新生成项目即可生效。
替换方案(尺寸不一致解决方案)
因为你刚替换完 ,尺寸与原来的是不一致的 ,所以就需要进一步的替换原先的尺寸
在 DPI 感知的应用程序中,当系统缩放比例从 100% 变为 150% 时,界面元素的实际像素尺寸计算遵循 “逻辑尺寸 × 缩放比例 = 实际像素尺寸” 的规则。以下是具体说明:
假设在 100% 缩放时,某按钮的逻辑尺寸为宽度 100 像素、高度 30 像:
- 100% 缩放(系数 1.0):实际像素尺寸 = 100 × 1.0 = 100 像素(宽),30 × 1.0 = 30 像素(高)。
- 150% 缩放(系数 1.5):实际像素尺寸 = 100 × 1.5 = 150 像素(宽),30 × 1.5 = 45 像素(高)。
举例说明:尺寸计算表(基准:89 × 31)
缩放比例 | 缩放系数 | 实际宽度(像素) | 实际高度(像素) | 计算逻辑 |
---|---|---|---|---|
100% | 1.0 | 89 | 31 | 89 × 1.0 = 89;31 × 1.0 = 31 |
150% | 1.5 | 133.5 | 46.5 | 89 × 1.5 = 133.5;31 × 1.5 = 46.5 |
在 WinForms 应用中开启 DPI 感知后,系统缩放比例从 100% 变为 150% 时,Location
(控件位置,即 X、Y 坐标)的计算核心遵循 “基准逻辑坐标 × 缩放系数(150% = 1.5)= 实际像素坐标” 规则,同时需结合 WinForms 的 DPI 适配机制(尤其是 .NET Framework 4.6+ 或 .NET Core 3.0+ 的高 DPI 支持),具体细节如下:
一、核心计算逻辑(手动计算场景)
若需手动计算 Location
,需明确两个前提:
- 基准坐标:100% 缩放时,控件在代码中定义的
Location
(如new Point(20, 30)
,即 X=20,Y=30),这是 “逻辑坐标”,对应 100% 缩放时的实际像素。 - 缩放系数:系统缩放比例对应的系数(100% = 1.0,150% = 1.5)。
计算公式::实际像素坐标(150% 缩放)= 基准逻辑坐标 × 1.5
示例:
假设 100% 缩放时控件基准 Location
为 (14, 6)
(X=14,Y=6):
- 100% 缩放(系数 1.0):实际坐标 =
(14×1.0, 6×1.0)
=(14, 6)
(像素)。 - 150% 缩放(系数 1.5):实际坐标 =
(14×1.5, 6×1.5)
=(21, 9)
(像素)。
写到最后
当然还有像这种自动适配的 ,不需要手动计算 ,就比如DPI自动缩放功能 ,但是我目前还不会这个 ,想着项目刚开始 ,就先以最简单的开始做起 ,也避免了代码中诸多的麻烦所在