gpt4 book ai didi

c# - 如何使紧凑的框架自定义控件支持 AutoScale

转载 作者:行者123 更新时间:2023-11-30 16:27:09 25 4
gpt4 key购买 nike

Windows 窗体(包括我正在使用的用于 Compact Framwork 的 Windows 窗体)有一个 AutoScale feature .通过设置 AutoScaleMode propertyAutoScaleMode.Dpi,例如,为 320x200 设计的应用程序会自动缩放到更大的显示器,例如 VGA 设备。

这很好用,但我有一些自制的自定义控件可以执行它们自己的 OnPaint 操作,我希望它们也可以扩展。不幸的是,我没有找到关于如何执行此操作的良好文档或示例。

目前,我正在这样做:

protected SizeF zoom = new SizeF(1.0, 1.0);

protected override void ScaleControl(SizeF factor, BoundsSpecified specified)
{
base.ScaleControl(factor, specified);
zoom = factor; // remember the zoom factor
}

protected override void OnPaint(PaintEventArgs e)
{
// scale everything by zoom.Width and zoom.Height
...
e.Graphics.DrawImage(...);
...
}

它有效,但我想知道这是否是“正确的方法”。由于(根据 ILSpy)其他 CF 控件都没有内部字段来存储比例因子,我想知道是否有更简单或更好的方法来执行此操作。

最佳答案

我们通常在控件和表单的 OnResize 中处理所有缩放。我们还必须支持许多具有疯狂尺寸和 DPI 的不同设备(一些平台甚至不报告正确的 DPI!)。我们发现在 AutoScaleMode 关闭的情况下,您可以按比例使用这样的帮助程序在 OnResize 中缩放窗体的子项。您只需在构造函数中添加一个 Size _initalSize 成员设置为表单大小。然而,我通常发现在大多数表单上我必须编写自定义布局代码以适当处理纵向和横向显示。

        protected override void OnResize(EventArgs e)
{
base.OnResize(e);

// Scale the control
ScaleChildren(this, ref _initialFormSize);
}


public static void ScaleChildren(Control control, ref Size initialSize, float fontFactor)
{
if (control == null || control.Size == initialSize)
return;

SizeF scaleFactor = new SizeF((float)control.Width / (float)initialSize.Width, (float)control.Height / (float)initialSize.Height);
initialSize = control.Size;

if (!float.IsInfinity(scaleFactor.Width) || !float.IsInfinity(scaleFactor.Height))
{
foreach (Control child in control.Controls)
{
child.Scale(scaleFactor);

if (child is Panel)
continue;

try
{
// scale the font
float scaledFontSize = (float)(int)(child.Font.Size * scaleFactor.Height * fontFactor + 0.5f);

System.Diagnostics.Debug.WriteLine(
string.Format("ScaleChildren(): scaleFactor = ({0}, {1}); fontFactor = {2}; scaledFontSize = {3}; \"{4}\"",
scaleFactor.Width, scaleFactor.Height, fontFactor, scaledFontSize, child.Text));

child.Font = new Font(child.Font.Name, scaledFontSize, child.Font.Style);
}
catch { }
}
}
}

关于c# - 如何使紧凑的框架自定义控件支持 AutoScale,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8153853/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com