vs 在高分屏下开发 winform 配置
一、窗体控件大小
第一种方法:使用网格避免整除误差
在选项中将Windows窗体设计器的LayoutMode(布局模式)改成SnapToGrid(对齐到网格),并将Default Grid Cell Size(默认网格大小)设为最小可缩放单元(或它的倍数),以避免移植时产生整除误差。同时由于这些单元是可见的,也使得将控件拖到合适的尺寸非常简单。
同时,应该将窗体的AutoScaleMode改为Dpi。默认的Font缩放使用系统默认字体的大小进行缩放,但是系统默认字体并不和DPI完全等比例,这样也会造成整除误差。
如果文字不能对齐的话,可以考虑调整TextAlign属性,比如单行Label推荐使用MiddleLeft、MiddleCenter或MiddleRight对齐方式,而不是默认的TopLeft对齐方式,以和其它控件的对齐方式统一。
最小可缩放单元如下表所示(最小可缩放单元=缩放/25%=DPI/24):
缩放 DPI值 最小可缩放单元
100% 96 4
125% 120 5
150% 144 6
175% 168 7
200% 192 8
225% 216 9
250% 240 10
Windows窗体设计器选项(150%):
效果:
第二种方法:使用布局容器进行布局
如果认真学习过WPF,就会知道WPF可通过Grid、StackPanel、WrapPanel等布局容器进行布局。实际上,Windows Forms也有两个这样的容器,叫做TableLayoutPanel和FlowLayoutPanel,其中前者和Grid一样是表格布局容器,而后者和WrapPanel一样是流式布局容器。
在新建了窗体之后,按照以下流程使用TableLayoutPanel(表格布局面板)布局控件:
1.拖拉父窗口到合适大小,属性设置如下:
Padding:设置合适的内边距【最小可缩放单元(如150%缩放下是6)或它的倍数】
2.拖一个TableLayoutPanel控件,属性设置如下:
Dock:设置为Fill(停靠方式=填充)
3.根据需要分割出Columns(列)和Rows(行)
要求:一个单元格最多只能放置一个控件(或容器),但是一个控件可跨多行或多列
4.拖其它控件(或容器)到对应单元格,设置
Dock:设置为Fill(停靠方式=填充)
Margin:设置合适的外边距【最小可缩放单元(如150%缩放下是6)或它的倍数】
ColumnSpan:需要跨的列数
RowSpan:需要跨的行数
注意:Windows Forms中某些控件的Height属性有时不起作用(比如单行TextBox等),设置Dock属性并不能保证单元格被完全填充,但是只要文字仍然能够对齐就可以了。
FlowLayoutPanel(流式布局面板)和TableLayoutPanel有所不同,子控件要设置Width、Height、Margin属性,不能设置Dock属性,并且Width、Height和Margin一样也必须是最小可缩放单元的倍数。也就是说,仍然需要使用“对齐到网格”功能来完成设计。
运行阶段
默认情况下,Windows Forms程序由于高DPI支持不完整,在Windows Vista以后的系统中是由系统的DWM来缩放的(称为DPI虚拟化),这样的话会导致界面模糊。可以修改Program.cs并调用SetProcessDPIAware函数关闭DPI虚拟化,由程序自己来管理界面:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices; // 导入System.Runtime.InteropServices命名空间
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
static class Program
{
// 外部函数声明
[DllImport("kernel32.dll")]
private static extern IntPtr GetModuleHandle(string name);
// 这个函数只能接受ASCII,所以一定要设置CharSet = CharSet.Ansi,不然会失败
[DllImport("kernel32.dll", CharSet = CharSet.Ansi)]
private static extern IntPtr GetProcAddress(IntPtr hmod, string name);
private delegate void FarProc();
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
// SetProcessDPIAware是Vista以上才有的函数,需兼容XP的话不能直接调用,需按如下所示间接调用
IntPtr hUser32 = GetModuleHandle("user32.dll");
IntPtr addrSetProcessDPIAware = GetProcAddress(hUser32, "SetProcessDPIAware");
if (addrSetProcessDPIAware != IntPtr.Zero)
{
FarProc SetProcessDPIAware = (FarProc)Marshal.GetDelegateForFunctionPointer(addrSetProcessDPIAware, typeof(FarProc));
SetProcessDPIAware();
}
// C#的原有代码
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
}
如果不需要兼容Windows XP的话,可以更简单地直接调用SetProcessDPIAware:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices; // 导入System.Runtime.InteropServices命名空间
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
static class Program
{
// 外部函数声明
[DllImport("user32.dll")]
private static extern void SetProcessDPIAware();
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
// SetProcessDPIAware是Vista以上才有的函数,这样直接调用会使得程序不兼容XP
SetProcessDPIAware();
// C#的原有代码
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
}
.NET Framework 4.5.1提供了优化的高DPI支持,但需要手动开启,在工程中添加app.config(发布时需要将.exe文件和.exe.config文件一起发布),内容如下:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<appSettings>
<add key="EnableWindowsFormsHighDpiAutoResizing" value="true" />
</appSettings>
</configuration>
二 、FormSize和设计不符
Windows的高DPI支持是通过DWM(Desktop Window Manager)缩放实现的,但是有时候我们不希望这种效果(例如缩放会使一些内容变得模糊),因此需要禁用Windows高DPI对程序的缩放。有两种方式可以实现这种效果:一个是使用应用程序清单文件,一个是使用系统API实现。
1、使用清单文件
这里以Winform为例,右键项目->添加->新建项->应用程序清单文件,将含有dpiAware标签的属性取消注释,代码如下:
<application xmlns="urn:schemas-microsoft-com:asm.v3">
<windowsSettings>
<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
</windowsSettings>
</application>
2、使用系统API
下面的代码对Win7及以上的系统禁用高DPI。
if (Environment.OSVersion.Version.Major >= 6)
{
SetProcessDPIAware();
}
[DllImport("user32.dll")]
vs 在高分屏下开发 winform 配置的更多相关文章
- 解决在高分屏下开发winform界面变形
Form.AutoScaleMode = AutoScaleMode.None; 需要在超大屏下显示的时候,再考虑 AutoScaleMode.Font; AutoScaleMode.Dpi;
- 4k高分屏下,chm帮助文档,api文档打开后字体过小的解决
如图所示: 4k分辨率下,chm文件的正文部分的字体过小,这是这些网页可能使用了CSS维持字体dpi, 在普通分辨率下,可以显示正常,但在高分屏下就会显示得过小,这时我们就需要调整显示网页 的显示效果 ...
- Visual Studio高分屏下Winform界面变形
现在高分屏的电脑越来越多,2K屏,4K屏层出不穷,对于.net开发人员来说,尤其是Winform开发者, 分辨率一直是个比较头疼的事情,屏幕分辨率高了,如果仍然设置显示100%,会导致字体非常小,影响 ...
- Python在Windows下开发环境配置汇总
最近比较关注学习Python方面的资料和课程,由于Python本身基本都是在Linux下开发,本人windows用习惯了初用Linux各种别扭啊. 下面将我在配置Windows环境下的禁言写出来,与大 ...
- 修改Linux桌面高分屏下QT程序界面的缩放
问题 Linux下的高分屏在Gnome.KDE中有缩放因子一说,但是对QT程序(常用如 WPS.网易云音乐等)无效,这里只是简记修改QT程序的缩放方法 解决 su #切换root用户 cp /etc/ ...
- mac 下开发golang 配置
1.安装golang 见附件 2.默认安装在 /usr/local/go 目录下 3.配置环境变量: 编辑文件:vim /etc/profile,有的MAC 下没有这个文件,可以新建. 加入环境变量 ...
- java入门---windows和Linux,UNIX,Solaris,FreeBSD下开发环境配置
首先来看Windows下的操作.我们需要下载java开发工具包JDK.下载地址:http://www.oracle.com/technetwork/java/javase/downloads/ ...
- QT creator+OpenCV2.4.2+MinGW 在windows下开发环境配置
由于项目开发的原因,需要配置QT creator+OpenCV2.4.2+MinGW开发环境,现对配置方法做如下总结: 1. 下载必备软件 QT SDK for Open Source C++ de ...
- wxWidgets 在 Linux 下开发环境配置
本文基于 CodeBlocks (16.0.1) 和 wxWidgets (3.0.2) 搭建 Linux 下 GUI 开发环境. 1. 安装 CodeBlocks Ubuntu 默认的源当前 Cod ...
随机推荐
- linux net通信 基于密钥
配置SSHD服务 SSH(Secure Shell)是一种能够以安全的方式提供远程登录的协议,也是目前远程管理 Linux 系统的首选方式.在此之前,一般使用 FTP 或 Telnet 来进行远程登录 ...
- 20190715《Python网络数据采集》第 1 章
<Python网络数据采集>7月8号-7月10号,这三天将该书精读一遍,脑海中有了一个爬虫大体框架后,对于后续学习将更加有全局感. 此前,曾试验看视频学习,但是一个视频基本2小时,全部拿下 ...
- MySQL多表查询答案
一.综合练习 1.1 init.sql文件内容 /* 数据导入: Navicat Premium Data Transfer Source Server : localhost Source Serv ...
- SpringCloud之熔断器Hystrix及服务监控Dashboard
目的: 服务雪崩效应 服务熔断服务降级 Hystrix默认超时时间设置 Hystrix服务监控Dashboard 服务雪崩效应 雪崩效应就是一种不稳定的平衡状态也是加密算法的一种特征,它指明文 ...
- 网页中插入Flash动画(.swf)代码和常用参数设置
我们现在大部分人做网页,都是直接用DW插入flash,而且DW也是所见即所得,直接生成了相应的flash显示代码.可是我们又有多少人了解这些直接由DW生成的代码呢?其实我接触flash player标 ...
- vue3生命周期
介绍 vue3的生命周期函数,可以按需导入到组件中,且只能在 setup() 函数中使用 示例 import { onMounted, onUpdated } from '@vue/compositi ...
- Python之TensorFlow的基本介绍-1
一.TensorFlow™是一个基于数据流编程(dataflow programming)的符号数学系统,被广泛应用于各类机器学习(machine learning)算法的编程实现,其前身是谷歌的神经 ...
- [jsp学习笔记]servelt get post
1.post提交数据是隐式的,get是通过在url里面传递的(可以看一下你浏览器的地址栏),用来传递一些不需要保密的数据. 2.用get时,传输数据的大小有限制 (注意不是参数的个数有限制),为2K: ...
- 转 让NET C# 程序独立运行(脱离 .NET Framework运行,绿色运行) 未验证
但是.net版本众多.而且.NET Framework框架很大.拖着一个大大的.net Framework总是让人很郁闷. 在网上找呀找呀.找到另一个.NET Framework 替代方案.Mono. ...
- HTML基本代码
HTML 今天回顾html,总结一下今日所学内容. -------------------正文-------------------------- 目的:通过一些基础的标签制作关于LOL的静态网页 所 ...