亚洲必赢手机入口WinForm响应式布局规划执行,WinForm响应式布局规划执行

by admin on 2018年12月24日

引言

始建响应式WinForm应用程序并不那么简单。
响应式布局,在此我指的是应用程序在不同屏幕分辨率下的可用性。
对于WinForm应用程序,我们需要明白地遵照分辨率来调整控件的深浅和重复定位。
尽管在拔取WPF时有相关的实施应用,通过运用控件的docking和anchoring,或行使panels等模式,但本文提供了一种将响应式应用于WinForm应用程序的两样方法。

引言

始建响应式WinForm应用程序并不那么简单。
响应式布局,在此我指的是应用程序在不同屏幕分辨率下的可用性。
对于WinForm应用程序,我们需要明确地按照分辨率来调整控件的大大小小和另行定位。
即便在使用WPF时有相关的实施应用,通过应用控件的docking和anchoring,或使用panels等艺术,但本文提供了一种将响应式应用于WinForm应用程序的例外措施。

背景

本人在一个和谐规划的粗略游戏中相遇了问题:我计划了一台分辨率为1920×1080的机械,
不过当我准备在台式机电脑上广播时,发现应用程序边界跑到屏幕之外。由此很有必不可少让程序来适应不同分辨率的设备,而不是让用户来适应程序。
因而,我对代码举行了立异。

背景

本身在一个和谐计划的概括游戏中境遇了问题:我计划了一台分辨率为1920×1080的机器,
可是当我准备在笔记本电脑上广播时,发现应用程序边界跑到屏幕之外。因而很有必不可少让程序来适应不同分辨率的配备,而不是让用户来适应程序。
因而,我对代码举办了改革。

技术

其实没什么技术可言,只是用了一个小技巧。我们用六个常量来保存设计时的屏幕分辨率,我们誉为设计时分辨率。这样,无论什么日期运行应用程序,它都会赢得一个乘法因子,这事实上是一个百分比因子,通过将眼前分辨率除以设计时分辨率来取得该因子。
窗体的持有控件都被传送给这一个类对象举办缩放和调动大小。

技术

实质上没什么技术可言,只是用了一个小技巧。大家用多少个常量来保存设计时的屏幕分辨率,我们称为设计时分辨率。这样,无论哪一天运行应用程序,它都会拿到一个乘法因子,这实质上是一个比重因子,通过将眼前分辨率除以设计时分辨率来收获该因子。
窗体的有所控件都被传送给这多少个类对象开展缩放和调整大小。

代码

代码

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

比如说,该应用程序设计在1920×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

其实,这个办法再次来到缩放的控件与大小、地方和字体大小,而这一个值是体现的最佳值。

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

譬如,该应用程序设计在1920×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");
    }
}

使用 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。
上面的图样以二种不同的分辨率截取。
上边的截图是在1920×1080分辨率下截取的:
亚洲必赢手机入口 1

下边的截图是在1360×768分辨率下截取的:
亚洲必赢手机入口 2

上边的截图是在1024×768分辨率下截取的:
亚洲必赢手机入口 3

实质上,通过压缩/扩展和重新定位控制到最佳水平,Form在不同的分辨率下看起来是一样的。

示例

以下是一个十分简单的表单,其中饱含一个data
gird,一个label,一个textbox和一个button。
下边的图形以二种不同的分辨率截取。
上边的截图是在1920×1080分辨率下截取的:
亚洲必赢手机入口 4

下面的截图是在1360×768分辨率下截取的:
亚洲必赢手机入口 5

下面的截图是在1024×768分辨率下截取的:
亚洲必赢手机入口 6

实际上,通过缩短/扩张和重新定位控制到最佳水准,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");
        }
    }
}

兴许会基于业务员需要和控件的特性来调动代码。
另外,可能需要为不同的控件类型引入更多的重载方法。

代码调整

就像大家对垂直中央定位所做的那么,大家恐怕需要安装有些参数来调动总体布局。

此外,提出开发者尝试以不同的分辨率查看表单的外观,以确认所有的控件都是可见的,并遵从预期在屏幕上正确定位。

除开,对于一个粗略的表单,这是一个通用的法门,它假如表单的持有控件都独具这么些属性—宽度,中度,左侧,顶部和字体大小。可是,真实情状并非如此。有一些表单控件不具有所有这多少个属性。例如,图片框没有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等,这是一个更智慧的取舍。
尽管表单上有数千个控件,则可能会遇上加载延迟。
但是,这一点延迟对现在运作高效的处理器来说不成问题。
这种形式只是在表单的加载时才实施一回调用操作,由此不会带来沉重的习性降低的问题。

其他

如前所述,还有此外一些办法,例如使用WPF,使用anchoring/docking等,这是一个更通晓的挑选。
倘若表单上有数千个控件,则可能会遭受加载延迟。
但是,这一点延迟对当今运作高效的电脑来说不成问题。
这种措施只是在表单的加载时才实施两回调用操作,由此不会带来沉重的性能降低的问题。

结尾

创办响应式WinForm应用程序,依据机器的运行时刻分辨率自动调整大小,重新定位字体大小人己一视新校准字体大小,这是一种面向开发人士的章程。
只需将该类添加到品种中,在App.config文件中设置规划时分辨率,然后在窗体的加载事件中加上响应代码。
So easy!

结尾

始建响应式WinForm应用程序,遵照机器的周转时刻分辨率自动调整大小,重新定位字体大小并再次校准字体大小,这是一种面向开发人士的法门。
只需将该类添加到花色中,在App.config文件中安装规划时分辨率,然后在窗体的加载事件中增长响应代码。
So easy!

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图