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

84 篇文章 3 订阅

要使 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 分辨率,从而在高分辨率显示器上正确缩放和显示用户界面元素。

  • 8
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Windows应用程序的开发可以使用多种开发框架和技术。以下是一些常用的Windows应用程序开发框架: 1. .NET Framework:.NET Framework是一个广泛使用的开发框架,支持使用多种编程语言(如C#、VB.NET、F#等)进行Windows应用程序开发。它提供了丰富的类库和工具,可以用于开发桌面应用程序、Web应用程序和服务等。 2. Universal Windows Platform (UWP):UWP是一种用于开发跨设备的Windows应用程序的框架。它可以创建适用于多种设备(如PC、平板、手机、Xbox等)的通用应用程序,并提供了一致的用户体验和API集合。 3. Windows Presentation Foundation (WPF):WPF是一个用于创建富客户端应用程序的框架,它提供了丰富的UI控件、布局和动画功能,适用于创建具有复杂用户界面的Windows应用程序。 4. WinFormsWinForms是一种传统的Windows应用程序开发框架,它基于Windows Forms技术,提供了一组UI控件和事件模型,适用于创建传统的桌面应用程序。 5. Windows API:Windows API是Windows操作系统提供的一组原生API函数和接口,可以使用各种编程语言进行调用。使用Windows API可以实现更底层的Windows应用程序开发,但相对来说需要更多的编码工作。 除了以上框架,还有其他一些开发框架和技术可用于Windows应用程序开发,如Electron、Qt、Java(使用JavaFX或Swing)等。选择适合的开发框架取决于应用程序的需求、开发人员的技能和偏好等因素。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lijingguang

有钱捧个钱场,没钱捧个人场

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值