手机电池鼓了会爆炸吗

当前位置:澳门新葡亰平台官网 > 手机电池鼓了会爆炸吗 > 创建响应式WinForm应用程序并不那么简单

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

来源:http://www.baimantang.net 作者:澳门新葡亰平台官网 时间:2019-10-29 10:16

引言

创设响应式WinForm应用程序并不那么轻便。 响应式布局,在那笔者指的是应用程序在分歧荧屏分辨率下的可用性。 对于WinForm应用程序,大家须要鲜明地依照分辨率来调节控件的大小和重复定位。 就算在动用WPF时有相关的实施应用,通过采纳控件的docking和anchoring,或使用panels等艺术,但本文提供了风度翩翩种将响应式应用于WinForm应用程序的例外措施。

背景

本身在多少个谐和两全的大概游戏中相见了难题:笔者设计了生龙活虎台分辨率为一九二零x1080的机器, 可是当自身筹算在台式机计算机上播放时,开采应用程序边界跑到荧屏之外。因而很有必要让程序来适应分化分辨率的器械,并非让客户来适应程序。 由此,作者对代码举行了改进。

技术

实则没什么本领可言,只是用了二个小技能。我们用四个常量来保存设计时的显示屏分辨率,大家誉为设计时分辨率。那样,不论什么日期运转应用程序,它都会获取二个乘法因子,那实则是叁个百分比因子,通过将近些日子分辨率除以设计时分辨率来赢得该因子。 窗体的持有控件都被传送给那一个类对象进行缩放和调动大小。

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

The Responsive Class - Responsive.cs

创建响应式WinForm应用程序并不那么简单。创制二个类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的Computer上运维,则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

上边包车型客车截图是在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!

本文由澳门新葡亰平台官网发布于手机电池鼓了会爆炸吗,转载请注明出处:创建响应式WinForm应用程序并不那么简单

关键词:

上一篇:当我们在项目中引入了CEFGlue类库之后

下一篇:没有了