文档章节

winform分辨率问题解决方案

牛牛牛大棚
 牛牛牛大棚
发布于 2016/02/04 13:35
字数 588
阅读 187
收藏 2

一、问题分析

       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的效果有待进一步探究。


© 著作权归作者所有

共有 人打赏支持
牛牛牛大棚
粉丝 0
博文 11
码字总数 11265
作品 0
苏州
程序员
C# winform嵌入unity3D

  最近做项目需要winform嵌入unity的功能,由于完全没接触过这类嵌入的于是在网上搜,有一种方法是UnityWebPlayer插件,也开始琢磨了一段时间,不过一会发现在5.4版本以后这个东西就被淘汰...

swjian1997
02/05
0
0
C#中WinForm控件的跨线程更新,如何使用Invoke

目的: 用WinForm(C#)搭建一个用户界面,一个进度条和一个按钮,按钮启动进度条,进度完成时停止更新 示例: 实现: 在按钮事件中设置循环,更新进度条 private void btnProgress_Click(obj...

btvnlue
2015/11/17
0
0
不惧分裂 Google解决Android屏幕尺寸问题

Android软件人员最担忧的Android分裂性问题之一当属显示屏的不同尺寸。因每一部手机分辨率不同,软件人员需要精确计算出设计图标、照片、视频游戏背景和对话框等的占用空间。但Google表示已经...

虫虫
2012/01/29
3K
4
Android如何解决显示屏尺寸适配问题

Android软件人员最担忧的Android分裂性问题之一当属显示屏的不同尺寸。因每一部手机分辨率不同,软件人员需要精确计算出设计图标、照片、视频游戏背景和对话框等的占用空间。但Google表示已经...

虫虫
2012/01/30
5.5K
4
Winform开发框架之Office Ribbon界面

在前面几篇文章介绍我的Winform框架随笔文章,包括有《Winform开发框架之字典数据管理》、《Winform开发框架之权限管理系统》、《Winform开发框架之终极应用》,其中Winform开发框架之终极应...

长平狐
2012/08/22
514
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

php 使用redis锁限制并发访问类

1.并发访问限制问题 对于一些需要限制同一个用户并发访问的场景,如果用户并发请求多次,而服务器处理没有加锁限制,用户则可以多次请求成功。 例如换领优惠券,如果用户同一时间并发提交换领...

豆花饭烧土豆
6分钟前
0
0
Linux环境搭建 | 手把手教你配置Linux虚拟机

在上一节 「手把你教你安装Linux虚拟机」 里,我们已经安装好了Linux虚拟机,在这一节里,我们将配置安装好的Linux虚拟机,使其达到可以开发的程度。 Ubuntu刚安装完毕之后,还无法进行开发,...

良许Linux
8分钟前
0
0
Nginix开启SSL支持HTTPS访问(自签名方法)

Nginix开启SSL支持HTTPS访问(自签名方法) 超文本传输安全协议(缩写:HTTPS,英语:Hypertext Transfer Protocol Secure)是超文本传输协议和SSL/TLS的组合,用以提供加密通讯及对网络服务器...

openthings
24分钟前
0
0
(三)Nginx配置·续

概述 前文写了关于Nginx环境配置,但是还没有完,接下来将会继续讲三个相关的配置 主要是以下三个 1.Nginx访问日志 2.Nginx日志切割 3.静态文件不记录日志和过期时间 Nginx访问日志 1.先看看...

杉下
今天
1
0
jquery创建类似于java的map

var map = {}; // Map map = new HashMap(); map[key] = value; // map.put(key, value); var value = map[key]; // Object value = map.get(key); var has = key in map; // boolean has = ......

SuperDabai
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部