具有 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" 使用该应用程序一段时间,在圆圈之间移动鼠标。

到目前为止我已经做了这些观察:

  1. 当我关闭 WS_EX_COMPOSITED 样式时,问题消失了
  2. 当我强制工具提示的大小实际改变时(即使移动到另一个具有相同编号的圆),问题消失了

这表明可能 windows 和 WS_EX_COMPOSITED 样式在从隐藏状态变为可见状态时不知何故无法更新它们的大小。

有人知道这里发生了什么吗?完整的示例项目可用于 download

我设法将示例简化到可以得出结论的程度:具有 WS_EX_COMPOSITED 样式的 Form 通常会 未正确绘制 如果您隐藏它然后尝试再次显示它 而不改变它的大小 。 所以最简单的 hack 就是

protected override void OnVisibleChanged( EventArgs e )
{
    if( this.Visible )
    {
        this.Height++;
    }
}