我正在使用TableLayoutPanel来包含我希望在调整窗体大小时自动调整大小的控件。我想知道当表单本身调整大小时,如何使表单的子控件“缩放”大小与表单成比例?虽然TableLayoutPanel会自动调整所包含控件的大小,但这些控件的字体大小保持不变。
答案 0 :(得分: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);
}
}
}
}
}
}
答案 1 :(得分: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);
}
}
}
}
}
}