当前位置:健康减肥瘦身 > 美容护肤 > WinForm响应式构造规划试行

WinForm响应式构造规划试行

文章作者:美容护肤 上传时间:2019-12-03

使用 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");
    }
}

代码调度

就疑似大家对垂直大旨定位所做的那么,大家可能供给设置某些参数来调动总体构造。

别的,提出开垦者尝试以不一致的分辨率查看表单的外观,以确认全数的控件都是可以知道的,并依据预期在显示器上科学定位。

除去,对于三个简短的表单,那是二个通用的情势,它大器晚成旦表单的富有控件都统筹那几个属性---宽度,中度,左边,最上部和字体大小。可是,真真实情形形并不是那样。有部分表单控件不具备全部那么些属性。比如,图片框未有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!

引言

创办响应式WinForm应用程序并不那么粗略。 响应式结构,在这里作者指的是应用程序在不一致荧屏分辨率下的可用性。 对于WinForm应用程序,大家要求驾驭地根据分辨率来调动控件的深浅和重复定位。 纵然在接纳WPF时有相关的推行应用,通过运用控件的docking和anchoring,或应用panels等格局,但本文提供了生龙活虎种将响应式应用于WinForm应用程序的分歧方式。

技术

实质上没什么技艺可言,只是用了四个小技艺。大家用七个常量来保存设计时的荧屏分辨率,大家称为设计时分辨率。那样,无论几时运转应用程序,它都会得到一个乘法因子,那实乃二个百分比因子,通过将眼下分辨率除以设计时分辨率来赢得该因子。 窗体的享有控件都被传送给这一个类对象开展缩放和调节大小。

代码

示例

以下是三个超轻便的表单,当中含有三个data gird,二个label,一个textbox和一个button。 上面包车型大巴图样以三种差别的分辨率截取。 下边包车型客车截图是在1919x1080分辨率下截取的:
图片 1

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

上边包车型客车截图是在1024x768分辨率下截取的:
图片 3

实则,通过压缩/扩展和重新定位调控到最棒水平,Form在差别的分辨率下看起来是相符的。

背景

本身在八个温馨规划的简易游戏中相见了难点:我陈设了风姿洒脱台分辨率为1920x1080的机械, 然而当本人筹划在台式机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;
}

举个例子说,该应用程序设计在一九二〇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

实质上,那几个方法重回缩放的控件与大小、地方和字体大小,而那么些值是显示的最好值。

本文由健康减肥瘦身发布于美容护肤,转载请注明出处:WinForm响应式构造规划试行

关键词: