您的位置:首页 > 教育 > 培训 > 响应式框架_漂亮的网页设计欣赏_常用的网络推广方法有_怎么自己开发网站

响应式框架_漂亮的网页设计欣赏_常用的网络推广方法有_怎么自己开发网站

2024/10/5 15:23:31 来源:https://blog.csdn.net/CuPhoenix/article/details/142458987  浏览:    关键词:响应式框架_漂亮的网页设计欣赏_常用的网络推广方法有_怎么自己开发网站
响应式框架_漂亮的网页设计欣赏_常用的网络推广方法有_怎么自己开发网站

#C0106


沧海茫茫千钟粟,且拾吾昧一微尘

——《沧海拾昧集》@CuPhoenix


【阅前敬告】
沧海拾昧集仅做个人学习笔记之用,所述内容不专业不严谨不成体系
【如有问题必是本集记录有谬,切勿深究】

问题

    使用 C#(.NET8)进行 WinForms 程序开发时,如果主显示器的缩放比例不为100%,会出现窗体和控件显示尺寸异常的问题,网上通常的方案是在 Program.cs 中加入 SetProcessDPIAware(); 函数,但该函数可能对 .NET8 的 WinForms 程序无效。

[STAThread]static void Main() {if (Environment.OSVersion.Version.Major >= 6) SetProcessDPIAware();Application.EnableVisualStyles();Application.SetCompatibleTextRenderingDefault(false);Application.Run(new Form1());             // Edit as needed}[System.Runtime.InteropServices.DllImport("user32.dll")]private static extern bool SetProcessDPIAware();

解决

    通过参考 .NET8 的官方文档和 Git 手册,在 项目名.csproj 文件中(可以搜索 <Project Sdk = “Microsoft.NET.Sdk”> 找到该文件),将 <PropertyGrop></Property>中的内容修改为:

<PropertyGroup><OutputType>WinExe</OutputType><TargetFramework>net8.0-windows</TargetFramework><Nullable>enable</Nullable><UseWindowsForms>true</UseWindowsForms><ImplicitUsings>enable</ImplicitUsings><ApplicationHighDpiMode>DpiUnawareGdiScaled</ApplicationHighDpiMode><ForceDesignerDpiUnaware>true</ForceDesignerDpiUnaware>
</PropertyGroup>

说明

    资料1:WinForms GitHub 手册 - Designer HighDpi mode 中提到:

Issues
    The Winforms designer, when operating in SystemAware/PermonitorV2 mode, serializes layout metrics into the > > source file based on the Dpi setting of the current display device on which it is being rendered. This may lead to two kinds of problems.
    WinForms applications developed on a machine with DPI settings different from the machine where they are> > > executed may encounter layout inconsistencies.
Solution

<Project Sdk="Microsoft.NET.Sdk"><PropertyGroup><OutputType>WinExe</OutputType><TargetFramework>net7.0-windows</TargetFramework><Nullable>enable</Nullable><UseWindowsForms>true</UseWindowsForms><ImplicitUsings>enable</ImplicitUsings><ApplicationHighDpiMode>SystemAware</ApplicationHighDpiMode><ForceDesignerDpiUnaware>true</ForceDesignerDpiUnaware></PropertyGroup>

    但该解决方案中设置的 <ApplicationHighDpiMode> 属性值是错误的,SystemAware 将查询主监视器的 DPI 一次,并将此值用于所有监视器上的应用程序,因此不能解决问题。

    资料2:.NET8 Learn - ApplicationHighDpiMode,通过微软官方的学习手册,查阅该属性值的取值。ApplicationHighDpiMode 可设置为 HighDpiMode 枚举值之一:

说明
DpiUnaware应用程序窗口不会缩放 DPI 更改,并且始终假定比例系数为 100%。
DpiUnawareGdiScaled类似于 DpiUnaware,但提高了基于 GDI/GDI+ 的内容的质量。
PerMonitor此窗口会在创建 DPI 时对其进行检查,并在 DPI 更改时调整缩放比例。
PerMonitorV2类似于 PerMonitor,但启用了子窗口 DPI 更改通知、comctl32 控件的改进缩放和对话框缩放。
SystemAware如果未指定,则为默认值。窗口查询主监视器的 DPI 一次,并将此值用于所有监视器上的应用程序。

选择合适的取值(如 DpiUnawareGdiScaled)即可。

敬谢诸君。


版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com