要使 WinForms(Windows Forms)应用程序识别高 DPI 分辨率并正确缩放显示元素

要使 WinForms(Windows Forms)应用程序识别高 DPI 分辨率并正确缩放显示元素,可以通过配置应用程序清单文件和应用程序配置文件来实现。以下是详细步骤:

1. 创建或修改应用程序清单文件

应用程序清单文件用于定义应用程序的 DPI 感知级别。以下示例将 DPI 感知设置为 `PerMonitorV2`:

  1. 在 Visual Studio 中,找到项目的属性窗口,选择"应用程序"选项卡。

  2. 单击"图标和清单"部分的"清单"按钮,选择"创建应用程序清单文件"。

  3. Visual Studio 会生成一个名为 `app.manifest` 的文件。打开此文件并添加或修改以下内容:

```xml

<assembly xmlns="urn:schemas-microsoft-com:asm.v3" manifestVersion="1.0">

<assemblyIdentity version="1.0.0.0" name="MyApplication.app"/>

<application>

<windowsSettings>

<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>

<dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitorV2</dpiAwareness>

</windowsSettings>

</application>

</assembly>

```

2. 修改应用程序配置文件 (`app.config`)

对于 .NET Framework 4.7 及更高版本,可以在应用程序的配置文件中添加以下设置,以启用高 DPI 感知:

  1. 如果项目中没有 `app.config` 文件,请添加一个。

  2. 打开 `app.config` 文件,添加以下内容:

```xml

<configuration>

<system.windows.forms.applicationConfiguration>

<add key="DpiAwareness" value="PerMonitorV2"/>

</system.windows.forms.applicationConfiguration>

</configuration>

```

3. 启用 Visual Styles 和 DPI 支持

在应用程序的入口点(通常是 `Program.cs` 文件)中,确保启用 Visual Styles 和 DPI 支持:

```csharp

using System;

using System.Windows.Forms;

namespace HighDpiWinFormsApp

{

static class Program

{

[STAThread]

static void Main()

{

Application.EnableVisualStyles();

Application.SetCompatibleTextRenderingDefault(false);

Application.SetHighDpiMode(HighDpiMode.PerMonitorV2); // .NET Core 3.0 及更高版本

Application.Run(new MainForm());

}

}

}

```

4. 调整表单和控件

确保您的表单和控件能够正确响应 DPI 变化。通常,WinForms 应用程序会自动处理大多数 DPI 变化,但在某些情况下,您可能需要手动调整控件大小和字体。

完整示例

以下是一个完整的示例,包括应用程序清单文件、配置文件和代码设置:

app.manifest

```xml

<assembly xmlns="urn:schemas-microsoft-com:asm.v3" manifestVersion="1.0">

<assemblyIdentity version="1.0.0.0" name="HighDpiWinFormsApp.app"/>

<application>

<windowsSettings>

<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>

<dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitorV2</dpiAwareness>

</windowsSettings>

</application>

</assembly>

```

app.config

```xml

<configuration>

<system.windows.forms.applicationConfiguration>

<add key="DpiAwareness" value="PerMonitorV2"/>

</system.windows.forms.applicationConfiguration>

</configuration>

```

Program.cs

```csharp

using System;

using System.Windows.Forms;

namespace HighDpiWinFormsApp

{

static class Program

{

[STAThread]

static void Main()

{

Application.EnableVisualStyles();

Application.SetCompatibleTextRenderingDefault(false);

Application.SetHighDpiMode(HighDpiMode.PerMonitorV2); // .NET Core 3.0 及更高版本

Application.Run(new MainForm());

}

}

}

```

5. 高 DPI 处理代码

在应用程序启动时,可以添加代码来处理高 DPI 设置。例如:

using System;

using System.Windows.Forms;

namespace HighDpiWinFormsApp

{

static class Program

{

[STAThread]

static void Main()

{

if (Environment.OSVersion.Version.Major >= 6)

{

SetProcessDpiAwareness();

}

Application.EnableVisualStyles();

Application.SetCompatibleTextRenderingDefault(false);

Application.Run(new MainForm());

}

private static void SetProcessDpiAwareness()

{

// 设置进程的 DPI 感知级别为 Per Monitor V2

NativeMethods.SetProcessDpiAwareness(NativeMethods.PROCESS_DPI_AWARENESS.Process_Per_Monitor_DPI_Aware);

}

}

internal static class NativeMethods

{

public enum PROCESS_DPI_AWARENESS

{

Process_DPI_Unaware = 0,

Process_System_DPI_Aware = 1,

Process_Per_Monitor_DPI_Aware = 2

}

[System.Runtime.InteropServices.DllImport("shcore.dll")]

internal static extern int SetProcessDpiAwareness(PROCESS_DPI_AWARENESS value);

}

}

通过以上配置和代码设置,您的 WinForms 应用程序将能够识别和处理高 DPI 分辨率,从而在高分辨率显示器上正确缩放和显示用户界面元素。

相关推荐
比花花解语26 分钟前
Kafka在Windows系统使用delete命令删除Topic时出现的问题
windows·分布式·kafka
rainmanqqst1 小时前
耀世16Pro鼠标卡顿
windows
早起的年轻人2 小时前
Java List 自定义对象排序 Java 8 及以上版本使用 Stream API
java·windows·list
专注VB编程开发20年13 小时前
除了 EasyXLS,加载和显示.xlsx 格式的excel表格,并支持单元格背景色、边框线颜色和粗细等格式化特性
c++·windows·excel·mfc·xlsx
Natsuagin14 小时前
轻松美化双系统启动界面与同步时间设置(Windows + Ubuntu)
linux·windows·ubuntu·grub
xing.yu.CTF16 小时前
Web入侵实战分析-常见web攻击类应急处置实验2
运维·服务器·windows·web安全·apache·php漏洞·phpstudy后门漏洞
ceffans17 小时前
PDF文档中文本解析
c++·windows·pdf
SummerGao.18 小时前
Windows 快速搭建C++开发环境,安装C++、CMake、QT、Visual Studio、Setup Factory
c++·windows·qt·cmake·visual studio·setup factory
Igallta_81362219 小时前
【小游戏】C++控制台版本俄罗斯轮盘赌
c语言·开发语言·c++·windows·游戏·游戏程序
wave_sky21 小时前
Visual Studio中打开多个项目
ide·windows·visual studio