我正在使用 TableLayoutPanel 来包含我希望在调整表单大小时自动调整大小的控件。我想知道当表单本身被调整大小时,如何使表单的子控件的大小与表单成比例?尽管 TableLayoutPanel 会自动调整所包含控件的大小,但这些控件保持相同的字体大小。
问问题
12045 次
2 回答
6
这是迄今为止我想出的最好的方法。我使用两个比例因子,并遍历所有控件以选择性地选择要缩放的那些:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace TestTableLayoutPanel
{
public partial class Form2 : Form
{
private const float LARGER_FONT_FACTOR = 1.5f;
private const float SMALLER_FONT_FACTOR = 0.8f;
private int _lastFormSize;
public Form2()
{
InitializeComponent();
this.Resize += new EventHandler(Form2_Resize);
_lastFormSize = GetFormArea(this.Size);
}
private int GetFormArea(Size size)
{
return size.Height * size.Width;
}
private void Form2_Resize(object sender, EventArgs e)
{
var bigger = GetFormArea(this.Size) > _lastFormSize;
float scaleFactor = bigger ? LARGER_FONT_FACTOR : SMALLER_FONT_FACTOR;
ResizeFont(this.Controls, scaleFactor);
_lastFormSize = GetFormArea(this.Size);
}
private void ResizeFont(Control.ControlCollection coll, float scaleFactor)
{
foreach (Control c in coll)
{
if (c.HasChildren)
{
ResizeFont(c.Controls, scaleFactor);
}
else
{
//if (c.GetType().ToString() == "System.Windows.Form.Label")
if (true)
{
// scale font
c.Font = new Font(c.Font.FontFamily.Name, c.Font.Size * scaleFactor);
}
}
}
}
}
}
于 2013-01-14T23:36:19.110 回答
0
根据之前的答案,我写了一个真正的字体比例解决方案。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace MachineControlsTest
{
public partial class Form2 : Form
{
private int _lastFormSize;
public Form2()
{
InitializeComponent();
this.Resize += new EventHandler(Form2_Resize);
_lastFormSize = GetFormArea(this.Size);
}
private int GetFormArea(Size size)
{
return size.Height * size.Width;
}
private void Form2_Resize(object sender, EventArgs e)
{
Control control = (Control)sender;
float scaleFactor = (float)GetFormArea(control.Size) / (float)_lastFormSize;
ResizeFont(this.Controls, scaleFactor);
_lastFormSize = GetFormArea(control.Size);
}
private void ResizeFont(Control.ControlCollection coll, float scaleFactor)
{
foreach (Control c in coll)
{
if (c.HasChildren)
{
ResizeFont(c.Controls, scaleFactor);
}
else
{
//if (c.GetType().ToString() == "System.Windows.Form.Label")
if (true)
{
// scale font
c.Font = new Font(c.Font.FontFamily.Name, c.Font.Size * scaleFactor);
}
}
}
}
}
}
于 2018-10-31T10:11:53.210 回答