具有 WS_EX_COMPOSITED 样式的表单的奇怪行为
Weird behaviour of a form with WS_EX_COMPOSITED style
在我的应用程序中,我有一个自定义工具提示,它源自标准 System.Windows.Forms.Form
class。它有一个 WS_EX_COMPOSITED
样式集,可以防止闪烁。它可以包含多行文本和可选的一些控件。每当其内容发生变化时,都会重新计算其大小,以使其与其中控件的边界相匹配。但是,我注意到一些奇怪的行为 - 例如有时它无法完全显示,有时它被切断。
我创建了一个简单的应用程序来演示这些问题。看截图:
当您将鼠标移到显示的圆圈之一上时,工具提示应显示 N
行文本,其中 N
是画在圆圈内的数字。在屏幕截图中,您可以看到工具提示被剪切,因此只有 "Item #1" 可见。鼠标从“1”圆圈向左移动,工具提示内容更新为包含 9 行文本,但其大小保持不变。不幸的是,这些问题似乎是随机发生的,因此您必须 "play" 使用该应用程序一段时间,在圆圈之间移动鼠标。
到目前为止我已经做了这些观察:
- 当我关闭
WS_EX_COMPOSITED
样式时,问题消失了
- 当我强制工具提示的大小实际改变时(即使移动到另一个具有相同编号的圆),问题消失了
这表明可能 windows 和 WS_EX_COMPOSITED
样式在从隐藏状态变为可见状态时不知何故无法更新它们的大小。
有人知道这里发生了什么吗?完整的示例项目可用于 download。
我设法将示例简化到可以得出结论的程度:具有 WS_EX_COMPOSITED
样式的 Form
通常会 未正确绘制 如果您隐藏它然后尝试再次显示它 而不改变它的大小 。
所以最简单的 hack 就是
protected override void OnVisibleChanged( EventArgs e )
{
if( this.Visible )
{
this.Height++;
}
}
在我的应用程序中,我有一个自定义工具提示,它源自标准 System.Windows.Forms.Form
class。它有一个 WS_EX_COMPOSITED
样式集,可以防止闪烁。它可以包含多行文本和可选的一些控件。每当其内容发生变化时,都会重新计算其大小,以使其与其中控件的边界相匹配。但是,我注意到一些奇怪的行为 - 例如有时它无法完全显示,有时它被切断。
我创建了一个简单的应用程序来演示这些问题。看截图:
当您将鼠标移到显示的圆圈之一上时,工具提示应显示 N
行文本,其中 N
是画在圆圈内的数字。在屏幕截图中,您可以看到工具提示被剪切,因此只有 "Item #1" 可见。鼠标从“1”圆圈向左移动,工具提示内容更新为包含 9 行文本,但其大小保持不变。不幸的是,这些问题似乎是随机发生的,因此您必须 "play" 使用该应用程序一段时间,在圆圈之间移动鼠标。
到目前为止我已经做了这些观察:
- 当我关闭
WS_EX_COMPOSITED
样式时,问题消失了 - 当我强制工具提示的大小实际改变时(即使移动到另一个具有相同编号的圆),问题消失了
这表明可能 windows 和 WS_EX_COMPOSITED
样式在从隐藏状态变为可见状态时不知何故无法更新它们的大小。
有人知道这里发生了什么吗?完整的示例项目可用于 download。
我设法将示例简化到可以得出结论的程度:具有 WS_EX_COMPOSITED
样式的 Form
通常会 未正确绘制 如果您隐藏它然后尝试再次显示它 而不改变它的大小 。
所以最简单的 hack 就是
protected override void OnVisibleChanged( EventArgs e )
{
if( this.Visible )
{
this.Height++;
}
}