创建响应式WinForm应用程序并不那么简单

作者:游戏娱乐

引言

创立响应式WinForm应用程序并不那么简单。 响应式构造,在那小编指的是应用程序在不一样显示屏分辨率下的可用性。 对于WinForm应用程序,大家必要掌握地依据分辨率来调节控件的朗朗上口和重复定位。 即便在选择WPF时有相关的实施应用,通过使用控件的docking和anchoring,或行使panels等办法,但本文提供了黄金时代种将响应式应用于WinForm应用程序的不举例法。

背景

自个儿在叁个融洽两全的简单游戏中相遇了难点:小编设计了意气风发台分辨率为1919x1080的机器, 可是当自身筹算在台式机计算机上播报时,发掘应用程序边界跑到荧屏之外。因而很有须要让程序来适应区别分辨率的设备,并不是让客户来适应程序。 因此,笔者对代码举行了改过。

技术

实则没什么技艺可言,只是用了三个小能力。大家用多个常量来保存设计时的荧屏分辨率,我们誉为设计时分辨率。那样,无论几时运维应用程序,它都会获取叁个乘法因子,那实乃四个比例因子,通过将眼前分辨率除以设计时分辨率来赢得该因子。 窗体的具有控件都被传送给那几个类对象开展缩放和调度大小。

代码

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;
}

举个例子,该应用程序设计在一九一八x1080分辨率。 假诺此应用程序在分辨率为1024x768的微型机上运维,则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。 上边包车型客车图片以二种分裂的分辨率截取。 上面包车型地铁截图是在1917x1080分辨率下截取的:
图片 1

上面包车型客车截图是在1360x768分辨率下截取的:
图片 2

上面包车型客车截图是在1024x768分辨率下截取的:
图片 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等,这是八个更理解的取舍。 如若表单上有数千个控件,则恐怕会遭遇加载延迟。 但是,那点延迟对现行反革命运维高效的微处理机来讲符合规律。 这种艺术只是在表单的加载时才施行壹回调用操作,由此不会带动致命的性质降低的难题。

结尾

始建响应式WinForm应用程序,依照机器的运作时刻分辨率自动调节大小,重新定位字体大小天公地道复校准字体大小,那是大器晚成种面向开垦人士的点子。 只需将该类增加到项目中,在App.config文件中装置规划时分辨率,然后在窗体的加载事件中增加响应代码。 So easy!

本文由澳门皇冠844网站发布,转载请注明来源

关键词: .NET技术 WinForm 响应式设计