问题描述

建议:如果是刚开始写WinForm项目 ,建议刚开始就去进行一个替换 ,要不然后面会很麻烦的 ,不仅要计算size 还要去 计算 location 的值

昨天碰到了这个问题 ,当时设置完之后界面就非常的模糊 ,虽然说界面变大了 ,但是看着异常难受 ,很模糊

解决方案

  1. 新建应用程序清单文件(Application Manifest File)​ , 保持默认名称 app.manifest,点击添加。

  2. 找到这段代码:

    image

    1
    2
    3
    4
    5
    <application xmlns="urn:schemas-microsoft-com:asm.v3">
    <windowsSettings>
    <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
    </windowsSettings>
    </application>
  3. 替换DPI相关配置:

    1
    2
    3
    4
    5
    6
    7
    8
    <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>
  4. 保存文件,重新生成项目即可生效。

替换方案(尺寸不一致解决方案)

因为你刚替换完 ,尺寸与原来的是不一致的 ,所以就需要进一步的替换原先的尺寸


在 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,需明确两个前提:

  1. 基准坐标​:100% 缩放时,控件在代码中定义的 Location​(如 new Point(20, 30)​,即 X=20,Y=30),这是 “逻辑坐标”,对应 100% 缩放时的实际像素。
  2. 缩放系数​:系统缩放比例对应的系数(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自动缩放功能 ,但是我目前还不会这个 ,想着项目刚开始 ,就先以最简单的开始做起 ,也避免了代码中诸多的麻烦所在