【发布时间】:2020-05-25 13:03:09
【问题描述】:
我正在使用 WinForm 在 C# 中制作应用程序。我希望能够使用 ctrl + 滚动来调整此应用程序内所有标签的字体大小。 目前,我可以更改一个表单内所有标签的字体,但我想将此字体大小修改应用于所有表单,而不仅仅是当前表单。
要创建所有表单,我使用的是模板:
public partial class TemplateForm : DockContent
{
static public UInt16 percentageFontSize = 100;
public TemplateForm()
{
InitializeComponent();
}
private void TemplateForm_MouseWheel(object sender, MouseEventArgs e)
{
if (!ModifierKeys.HasFlag(Keys.Control))
{
return;
}
if (e.Delta > 0)
{
percentageFontSize += 10;
if (percentageFontSize >= 2000)
{
percentageFontSize = 2000;
}
}
else
{
percentageFontSize -= 10;
if (percentageFontSize <= 10)
{
percentageFontSize = 10;
}
}
SetAllControlsFont(this.Controls);
}
public static void SetAllControlsFont(System.Windows.Forms.Control.ControlCollection ctrls)
{
foreach (Control ctrl in ctrls)
{
if (ctrl.Controls != null)
SetAllControlsFont(ctrl.Controls);
ctrl.Font = new Font("Microsoft Sans Serif", 8* percentageFontSize / 100);
}
}
}
每个“文档”都使用这个模板:
public partial class Form1 : TemplateForm
{
public AccForm()
{
InitializeComponent();
}
}
public partial class Form2 : TemplateForm
{
public AccForm()
{
InitializeComponent();
}
}
“this.Controls”仅授予我对所选表单的控件的访问权限。我想我可以通过使用“TemplateForm”获得对表单的所有控制来实现这一点,但我不知道该怎么做。您对如何实现这一目标有任何想法吗?
【问题讨论】:
-
您应该覆盖
OnMouseWheel,但您现在所做的仍然适用于添加到派生表单的控件。DockContent是什么?TemplateForm不应该派生自Form吗? -
DockContent 用作“停靠管理器”并派生自
Form。我所做的不适用于添加到派生表单的控件。即使percentageFontSize是Static,它也只会更新焦点窗体的控件,而不是所有派生窗体。请您详细说明一下覆盖OnMouseWheel吗? -
您可以覆盖派生表单中的
WndProc并捕获从基本表单的OnMouseWheel覆盖发送的自定义消息或WM_FONTCHANGED。收到消息后,拨打SetAllControlsFont(this.Controls)。这个方法(属于基础Form)应该是protected internal,而percentageFontSize必须是protected static int。改变将是立竿见影的。就是这样。 -
如果它更舒服,您还可以覆盖基本表单的 WndProc 并在其中执行所有操作,如果您由于其他原因尚未在派生表单中覆盖 WndProc。