C#实现窗体中的各个控件同比自动放缩大小
程序员文章站
2022-11-22 18:33:02
实现方式主要是利用panel控件为主题,对于每个控件的大小位置和字体这几个属性进行记录,然后根据窗体改变的大小同时放缩。
简要步骤如下:
1、创建c#窗体程序项目。...
实现方式主要是利用panel控件为主题,对于每个控件的大小位置和字体这几个属性进行记录,然后根据窗体改变的大小同时放缩。
简要步骤如下:
1、创建c#窗体程序项目。
2、panel放置到窗体。
3、设置属性dock为fill。
4、注意minnumsize不能设置为0, 改成大于0都行。
复制代码 代码如下:
public partial class frmdemo : form
{
double dfrmwidth;
double dfrmheight;
double dzoomhorizon;
double dzoomverticality;
dictionary<string, string> diccontrolsattribute = new dictionary<string, string>();
protected void getallinitiatecontrlinfo(control crlcontainer)
{
if (crlcontainer.parent == this)
{
dfrmwidth = convert.todouble(crlcontainer.width);
dfrmheight = convert.todouble(crlcontainer.height);
}
foreach (control item in crlcontainer.controls)
{
if (item.name.trim() != "")
diccontrolsattribute.add(item.name, (item.left + item.width / 2) + "," + (item.top + item.height / 2)
+ "," + item.width + "," + item.height + "," + item.font.size);
if ((item as usercontrol) == null && item.controls.count > 0)
getallinitiatecontrlinfo(item);
}
}
private void changecontrolsinitiate(control crlcontainer)
{
dzoomhorizon = (convert.todouble(crlcontainer.width) / dfrmwidth);
dzoomverticality = (convert.todouble(crlcontainer.height) / dfrmheight);
}
private void changecurrentcontrolattr(control crlcontainer)
{
double[] dposition = new double[5];
foreach (control item in crlcontainer.controls)
{
if (item.name.trim() != "")
{
if ((item as usercontrol) == null && item.controls.count > 0)
changecurrentcontrolattr(item);
string[] strs = diccontrolsattribute[item.name].split(',');
for (int j = 0; j < 5; j++)
{
dposition[j] = convert.todouble(strs[j]);
}
double itemwidth = dposition[2] * dzoomhorizon;
double itemheight = dposition[3] * dzoomverticality;
item.left = convert.toint32(dposition[0] * dzoomhorizon - itemwidth / 2);
item.top = convert.toint32(dposition[1] * dzoomverticality - itemheight / 2);
item.width = convert.toint32(itemwidth);
item.height = convert.toint32(itemheight);
//item.font = new font(item.font.name, float.parse
//((dposition[4] * math.min(dzoomhorizon, dzoomverticality)).tostring()));
//字体也可以实现同比放缩。
}
}
}
protected override void onsizechanged(eventargs e)
{
base.onsizechanged(e);
if (diccontrolsattribute.count > 0)
{
changecontrolsinitiate(this.controls[0]);
changecurrentcontrolattr(this.controls[0]);
}
}
public frmdemo()
{
initializecomponent();
getallinitiatecontrlinfo(this.controls[0]);//构造函数里面调用即可。
}
}
5、效果测试