在 .NET Framework 版本 2.0 中,通过对 Windows 窗体的自动缩放进行下列更改而克服了前面提到的缺陷:
对缩放的基本支持已经移到 ContainerControl 类,这样窗体、本机复合控件和用户控件都会获得统一的缩放支持。此外,添加了 AutoScaleFactor、AutoScaleDimensions、AutoScaleMode 和 PerformAutoScale 这些新成员。
Control 类也拥有若干新成员,这些新成员允许该类参与缩放并支持在同一窗体上进行混合缩放。具体地说,是 Scale、ScaleChildren 和 GetScaledBounds 这些成员支持缩放。
作为系统字体支持的补充,已经添加了建立在屏幕分辨率基础上的缩放支持,如 AutoScaleMode 枚举所定义。此模式与 .NET Compact Framework 支持的自动缩放是兼容的,这样更易于进行应用程序的迁移。
与诸如 FlowLayoutPanel 和 TableLayoutPanel 等布局管理器的兼容性已经添加到自动缩放的实现中。
缩放比例因子现在表示为浮点值,通常使用 SizeF 结构,这样实际上已经消除了舍入误差。
具体示例代码如下:
private void Form1_Load(object sender, EventArgs e)
{
LoadForm(sender, e);
// do some other local here for you application
AutoScale(this);
}
void LoadForm(object sender, EventArgs e)
{
//这里是不同的分辨率设置控件的显示
this.Tag = 622 + "," + 527;
string[] tmp = ((Form)sender).Tag.ToString().Split(',');
float width = (float)((Form)sender).Width / (float)Convert.ToInt16(tmp[0]);
float heigth = (float)((Form)sender).Height / (float)Convert.ToInt16(tmp[1]);
((Form)sender).Tag = ((Form)sender).Width.ToString() + "," + ((Form)sender).Height;
foreach (Control control in ((Form)sender).Controls)
{
control.Scale(new SizeF(width, heigth));
}
}
//这里是让所有的控件随窗体的变化而变化
public void AutoScale(Form frm)
{
frm.Tag = frm.Width.ToString() + "," + frm.Height.ToString();
frm.SizeChanged += new EventHandler(Form1_SizeChanged);
}
void Form1_SizeChanged(object sender, EventArgs e)
{
try
{
tmp = ((Form)sender).Tag.ToString().Split(',');
if ((int)((Form)sender).Width > 200)
{
float width = (float)((Form)sender).Width / (float)Convert.ToInt16(tmp[0]);
float heigth = (float)((Form)sender).Height / (float)Convert.ToInt16(tmp[1]);
((Form)sender).Tag = ((Form)sender).Width.ToString() + "," + ((Form)sender).Height;
foreach (Control control in ((Form)sender).Controls)
{
control.Scale(new SizeF(width, heigth));
}
}
}
catch {
// log your exception here
}
}