2020年12月23日
Jerry
13545
2021年1月17日
C# Winform 常用来开发桌面程序,不同的电脑有不同的分辨率,需要适应不同的窗体,其中的控件如何根据窗体大小进行缩放呢?
举个例子:
有个程序界面如下:
运行时,窗口没有最大化的时候,图片基本居中:
当窗口拉动改变大小或最大化时,图片框并没有随之改变:
怎么解决这个问题呢??百度了一堆,终于找到个解决办法。
1、给这个项目添加一个类,我这里时MyForm 继承Form,其中整个类代码如下
public partial class Myform: Form
{
private float X, Y;
//获得控件的长度、宽度、位置、字体大小的数据
private void setTag(Control cons)//Control类,定义控件的基类
{
foreach (Control con in cons.Controls)
{
con.Tag = con.Width + ":" + con.Height + ":" + con.Left + ":" + con.Top + ":" + con.Font.Size;//获取或设置包含有关控件的数据的对象
if (con.Controls.Count > 0)
setTag(con);//递归算法
}
}
private void setControls(float newx, float newy, Control cons)//实现控件以及字体的缩放
{
foreach (Control con in cons.Controls)
{
string[] mytag = con.Tag.ToString().Split(new char[] { ':' });
float a = Convert.ToSingle(mytag[0]) * newx;
con.Width = (int)a;
a = Convert.ToSingle(mytag[1]) * newy;
con.Height = (int)(a);
a = Convert.ToSingle(mytag[2]) * newx;
con.Left = (int)(a);
a = Convert.ToSingle(mytag[3]) * newy;
con.Top = (int)(a);
Single currentSize = Convert.ToSingle(mytag[4]) * newy;
con.Font = new Font(con.Font.Name, currentSize, con.Font.Style, con.Font.Unit);
if (con.Controls.Count > 0)
{
setControls(newx, newy, con);//递归
}
}
}
private void MyForm_Resize(object sender, EventArgs e)
{
float newx = (this.Width) / X;//当前宽度与变化前宽度之比
float newy = this.Height / Y;//当前高度与变化前宽度之比
setControls(newx, newy, this);
this.Text = this.Width.ToString() + " " + this.Height.ToString(); //窗体标题显示长度和宽度
}
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
this.Resize += new EventHandler(MyForm_Resize);
X = this.Width;
Y = this.Height;
setTag(this);
}
}
2、使之前的窗体继承这个MyForm即可搞定。
public partial class Form1 : MyForm
{
public Form1()
{
InitializeComponent();
}
}
效果来个动图
不过,winform 做界面还是太挫了。有能力还是搞搞 WPF更舒服一些吧。。
原创文章,转载请注明出处:
https://jerrycoding.com/article/winform_scale
微信
支付宝