透过将近些日子分辨率除以设计时分辨率来获得该因子永利网上娱乐

引言

创造响应式WinForm应用程序并不那么轻松。
响应式布局,在此笔者指的是应用程序在分歧显示器分辨率下的可用性。
对于WinForm应用程序,大家必要理解地依据分辨率来调动控件的轻重缓急和重复定位。
即使在采纳WPF时有相关的试行应用,通过使用控件的docking和anchoring,或行使panels等办法,但本文提供了一种将响应式应用于WinForm应用程序的不比如法。

背景

自家在一个和睦统一计划的轻便游戏中相遇了难点:作者设计了一台分辨率为1917×1080的机械,
不过当本身盘算在台式机Computer上播放时,开掘应用程序边界跑到荧屏之外。由此很有不可缺少让程序来适应区别分辨率的设施,并非让顾客来适应程序。
因而,小编对代码进行了核对。

技术

事实上没什么才具可言,只是用了贰个小技巧。大家用四个常量来保存设计时的显示器分辨率,大家誉为设计时分辨率。这样,无论几时运营应用程序,它都会博得四个乘法因子,那实质上是叁个百分比因子,通过将近些日子分辨率除以设计时分辨率来获得该因子。
窗体的有着控件都被传送给那些类对象实行缩放和调动大小。

代码

The Responsive Class – Responsive.cs

成立三个类Responsive.cs,添加5个变量。

float WIDTH_AT_DESIGN_TIME = (float)Convert.ToDouble
                             (ConfigurationManager.AppSettings["DESIGN_TIME_SCREEN_WIDTH"]);
float HEIGHT_AT_DESIGN_TIME = (float)Convert.ToDouble
                              (ConfigurationManager.AppSettings["DESIGN_TIME_SCREEN_HEIGHT"]);
Rectangle Resolution;
float WidthMultiplicationFactor;
float HeightMultiplicationFactor;

规划时显示屏分辨率保存在App.config文件中。

<add key ="DESIGN_TIME_SCREEN_WIDTH" value="1920"/>
<add key ="DESIGN_TIME_SCREEN_HEIGHT" value="1080"/>

当类的三个实例被创设时,当前的深入分析被提要求构造函数。
之后调用该类的SetMultiplicationFactor()方法。
这种艺术通过将近来分辨率除以设计时间分辨率来得到缩放因子。

public Responsive(Rectangle ResolutionParam)
{
    Resolution = ResolutionParam;
}

public void SetMultiplicationFactor()
{
    WidthMultiplicationFactor = Resolution.Width / WIDTH_AT_DESIGN_TIME;
    HeightMultiplicationFactor = Resolution.Height / HEIGHT_AT_DESIGN_TIME;
}

举例说,该应用程序设计在1917×1080分辨率。
如果此应用程序在分辨率为1024×768的管理器上运维,则WidthMultiplicationFactor和HeightMultiplicationFactor改动如下:

WidthMultiplicationFactor = 1024/1920 = 0.533
HeightMultiplicationFactor = 768/1080 = 0.711

终极有二种重载方法,它们为应用程序控件提供响应式建设方案(最好大小,地方和字体大小)的末段方法。

public int GetMetrics(int ComponentValue)
{
    return (int)(Math.Floor(ComponentValue * WidthMultiplicationFactor));
}

public int GetMetrics(int ComponentValue, string Direction)
{
    if (Direction.Equals("Width") || Direction.Equals("Left"))
        return (int)(Math.Floor(ComponentValue * WidthMultiplicationFactor));
    else if (Direction.Equals("Height") || Direction.Equals("Top"))
        return (int)(Math.Floor(ComponentValue * HeightMultiplicationFactor));
    return 1;
}

诸如,假如存在宽度=465,中度=72,左=366,顶端=41和字体大小=40的控件,则该办法重返建议的轻重缓急,地方和字体大小为:

Width = 465 * 0.533 = 248
Height = 72 * 0.711= 51
Left = 366 * 0.533= 195
Top = 41 * 0.711= 29
Font-size = 40 * 0.533 = 21

实则,这一个点子重返缩放的控件与大小、地点和字体大小,而那么些值是显示的最好值。

使用 Responsive Class

咱俩须要的是以任何索要响应的花样轻便地创建那些类的靶子。
当前的分辨率是在构造函数中提供的, 之后的职业便是创建所需的乘法因子。

Responsive ResponsiveObj;
ResponsiveObj = new Responsive(Screen.PrimaryScreen.Bounds);
ResponsiveObj.SetMultiplicationFactor();

在那之后,表单的保有控件都将每一种传递,以在表单的加载事件中调解大小和另行定位。
那几个调用在底下的代码中形成。 它所做的是率先将窗体定位到荧屏的主干。
小编在这里安装了一个校准常数(30),为顶级的垂直地方增添控件,那也许因开荒人员而异。
之后,表单的每四个控件都会重复定位,调解大小,并再次校准字体大小。

private void ResponsiveForm_Load(object sender, EventArgs e)
{
    Width = ResponsiveObj.GetMetrics(Width, "Width");           // Form width and height set up.
    Height = ResponsiveObj.GetMetrics(Height, "Height");
    Left = Screen.GetBounds(this).Width / 2 - Width / 2;        // Form centering.
    Top = Screen.GetBounds(this).Height / 2 - Height / 2 - 30;  // 30 is a calibration factor.

    foreach (Control Ctl in this.Controls)
    {
        Ctl.Font = new Font(FontFamily.GenericSansSerif, 
                   ResponsiveObj.GetMetrics((int)Ctl.Font.Size), FontStyle.Regular);
        Ctl.Width = ResponsiveObj.GetMetrics(Ctl.Width, "Width");
        Ctl.Height = ResponsiveObj.GetMetrics(Ctl.Height, "Height");
        Ctl.Top = ResponsiveObj.GetMetrics(Ctl.Top, "Top");
        Ctl.Left = ResponsiveObj.GetMetrics(Ctl.Left, "Left");
    }
}

示例

以下是三个非常轻便的表单,其中包涵二个data
gird,一个label,贰个textbox和一个button。
上边包车型大巴图样以三种不相同的分辨率截取。
上面包车型客车截图是在一九一六x1080分辨率下截取的:
永利网上娱乐 1

上面包车型地铁截图是在1360×768分辨率下截取的:
永利网上娱乐 2

下边的截图是在1024×768分辨率下截取的:
永利网上娱乐 3

实际上,通过压缩/扩展和重新定位调控到一级水平,Form在差异的分辨率下看起来是平等的。

代码调度

就如大家对垂直主旨定位所做的这样,大家大概供给设置有些参数来调动总体布局。

除此以外,提出开采者尝试以差异的分辨率查看表单的外观,以确认全体的控件都以可知的,并服从预期在显示器上正明显位。

除此之外,对于三个简约的表单,这是一个通用的主意,它若是表单的享有控件都独具那些属性—宽度,中度,左侧,最上部和字体大小。不过,实际情状并不是那样。有点表单控件不具有全数那一个属性。比如,图片框未有font-size属性。由此,借使如此的意况下没有明白管理,运维代码将会招致运维时十一分。本文意在介绍这种艺术,开辟人士需求依附实际处境张开校准。建议的方法如下:

private void ResponsiveForm_Load(object sender, EventArgs e)
{
    Width = ResponsiveObj.GetMetrics(Width, "Width");           // Form width and height set up.
    Height = ResponsiveObj.GetMetrics(Height, "Height");
    Left = Screen.GetBounds(this).Width / 2 - Width / 2;        // Form centering.
    Top = Screen.GetBounds(this).Height / 2 - Height / 2 - 30;  // 30 is a calibration factor.

    foreach (Control Ctl in this.Controls)
    {
        if (Ctl is PictureBox)
        {
            Ctl.Width = ResponsiveObj.GetMetrics(Ctl.Width, "Width");
            Ctl.Height = ResponsiveObj.GetMetrics(Ctl.Height, "Height");
            Ctl.Top = ResponsiveObj.GetMetrics(Ctl.Top, "Top");
            Ctl.Left = ResponsiveObj.GetMetrics(Ctl.Left, "Left");
        }
        else
        {
            Ctl.Font = new Font(FontFamily.GenericSansSerif, 
                                ResponsiveObj.GetMetrics((int)Ctl.Font.Size), FontStyle.Regular);
            Ctl.Width = ResponsiveObj.GetMetrics(Ctl.Width, "Width");
            Ctl.Height = ResponsiveObj.GetMetrics(Ctl.Height, "Height");
            Ctl.Top = ResponsiveObj.GetMetrics(Ctl.Top, "Top");
            Ctl.Left = ResponsiveObj.GetMetrics(Ctl.Left, "Left");
        }
    }
}

大概会基于业务员必要和控件的性质来调动代码。
其它,恐怕必要为分歧的控件类型引入越来越多的重载方法。

其他

如前所述,还应该有其余一些办法,举个例子使用WPF,使用anchoring/docking等,这是八个更掌握的挑选。
若是表单上有数千个控件,则或许会遭受加载延迟。
但是,那一点延迟对当今运作高效的微型Computer来讲不是难点。
这种艺术只是在表单的加载时才施行三遍调用操作,由此不会带来沉重的性质减少的难题。

结尾

创设响应式WinForm应用程序,依照机器的周转时刻分辨率自动调度大小,重新定位字体大小并再次校准字体大小,那是一种面向开拓职员的艺术。
只需将该类增多到项目中,在App.config文件中安装规划时分辨率,然后在窗体的加载事件中增进响应代码。
So easy!

相关文章