winform分辨率问题解决方案
2016-02-04 00:00
344 查看
一、问题分析
winform程序在不同分辨率下产生界面混乱的主要原因是,默认情况下winform程序的坐标是基于Point(点)的,Point与DPI(分辨率,每英寸所打印点数)相关。当DPI发生变化时,显示在界面上的尺寸根据DPI自动变化,导致界面与设计之初产生错乱。
二、解决方案
方案1 利用AutoScaleMode 属性,将窗体的AutoScaleMode 属性设置为Dpi。
Dpi:根据显示分辨率控制缩放。常用分辨率为 96 和 120 DPI。
Font:根据类使用的字体(通常为系统字体)的维度控制缩放。
Inherit:根据类的父类的缩放模式控制缩放。如果不存在父类,则禁用自动缩放。
None:禁用自动缩放。
方案2 借鉴web程序中以pixel(像素)为常用单位,在winform程序中使用像素来定位,在Form的构造函数中将窗体的AutoScaleMode 属性设置为Font。
方案3 记录下1920*1080分辨率下工作区域的Width和Height,记作DefaultWidth和DefaultHeight,用改变分辨率之后的工作区域的Width和Height去分别除DefaultWidth和DefaultHeight,得到缩放比例,再调整主界面和各控件的缩放。
三、方案分析
方案1和方案2存在一定问题,一方面,在MSDN里有一条警告是不支持在同一窗口里将DPI模式和Font模式混合使用;另一方面,根据网上的实际经验,自动放缩和窗口布局的Dock、Anchor有时也会有冲突,也就是说目前采用方案1和方案2的自动放缩功能仍不够理想。
方案3的效果有待进一步探究。
winform程序在不同分辨率下产生界面混乱的主要原因是,默认情况下winform程序的坐标是基于Point(点)的,Point与DPI(分辨率,每英寸所打印点数)相关。当DPI发生变化时,显示在界面上的尺寸根据DPI自动变化,导致界面与设计之初产生错乱。
二、解决方案
方案1 利用AutoScaleMode 属性,将窗体的AutoScaleMode 属性设置为Dpi。
Dpi:根据显示分辨率控制缩放。常用分辨率为 96 和 120 DPI。
Font:根据类使用的字体(通常为系统字体)的维度控制缩放。
Inherit:根据类的父类的缩放模式控制缩放。如果不存在父类,则禁用自动缩放。
None:禁用自动缩放。
方案2 借鉴web程序中以pixel(像素)为常用单位,在winform程序中使用像素来定位,在Form的构造函数中将窗体的AutoScaleMode 属性设置为Font。
private void InitializeComponent() { //设定按字体来缩放控件 this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; //设定字体大小为12px this.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Pixel, ((byte)(134))); }
方案3 记录下1920*1080分辨率下工作区域的Width和Height,记作DefaultWidth和DefaultHeight,用改变分辨率之后的工作区域的Width和Height去分别除DefaultWidth和DefaultHeight,得到缩放比例,再调整主界面和各控件的缩放。
public class AutoReSizeForm { static float SH { get { return (float)Screen.PrimaryScreen.Bounds.Height / DefaultHeight; } } static float SW { get { return (float)Screen.PrimaryScreen.Bounds.Width / DefaultWidth; } } public static void SetFormSize(Control fm) { fm.Location = new Point((int)(fm.Location.X * SW), (int)(fm.Location.Y * SH)); fm.Size = new Size((int)(fm.Size.Width * SW), (int)(fm.Size.Height * SH)); fm.Font = new Font(fm.Font.Name, fm.Font.Size * SH,fm.Font.Style,fm.Font.Unit,fm.Font.GdiCharSet,fm.Font.GdiVerticalFont); if (fm.Controls.Count!=0) { SetControlSize(fm); } } private static void SetControlSize(Control InitC) { foreach (Control c in InitC.Controls) { c.Location = new Point((int)(c.Location.X * SW), (int)(c.Location.Y * SH)); c.Size = new Size((int)(c.Size.Width * SW), (int)(c.Size.Height * SH)); c.Font = new Font(c.Font.Name, c.Font.Size * SH, c.Font.Style, c.Font.Unit, c.Font.GdiCharSet, c.Font.GdiVerticalFont); if (c.Controls.Count != 0) { SetControlSize(c); } } } }
三、方案分析
方案1和方案2存在一定问题,一方面,在MSDN里有一条警告是不支持在同一窗口里将DPI模式和Font模式混合使用;另一方面,根据网上的实际经验,自动放缩和窗口布局的Dock、Anchor有时也会有冲突,也就是说目前采用方案1和方案2的自动放缩功能仍不够理想。
方案3的效果有待进一步探究。
相关文章推荐
- winform绑定快捷键的方法
- C#实现WinForm捕获最小化事件的方法
- WinForm之BindingSource基础操作实例教程
- WinForm相对路径的陷阱
- winform实现拖动文件到窗体上的方法
- WinForm实现程序一段时间不运行自动关闭的方法
- C#采用Winform实现类似Android的Listener
- WinForm自定义控件应用实例
- WinForm实现为TextBox设置水印文字功能
- C#设置WinForm中DataGrid列的方法(列宽/列标题等)
- winform 实现控制输入法
- WinForm实现最小化到系统托盘方法实例详解
- WinForm中的几个实用技巧汇总
- WinForm实现按名称递归查找控件的方法
- Winform窗体传值的方法(示例)
- Winform实现抓取web页面内容的方法
- WinForm实现自定义右下角提示效果的方法
- WinForm特效之桌面上的遮罩层实现方法
- C#中如何使用Winform实现炫酷的透明动画界面
- Winform消除button按下出现的虚线简单实现方法