具有WS_EX_COMPOSITED样式的表单的奇怪行为

时间:2015-02-25 16:19:13

标签: c# winforms tooltip

在我的应用程序中,我有一个自定义工具提示,它源自标准System.Windows.Forms.Form类。它具有WS_EX_COMPOSITED样式集,可防止闪烁。它可以包含多行文本,也可以包含一些控件。每当其内容发生变化时,都会重新计算其大小,使其与其中的控件的边界相匹配。但是,我注意到了一些奇怪的行为 - 例如,有时它无法完全显示出来,有时会被切断。

我创建了一个简单的应用程序来演示这些问题。看截图: Screenshot of the sample application

当您将鼠标移动到其中一个显示的圆圈上时,工具提示应显示N行文字,其中N是圆圈内绘制的数字。在屏幕截图中,您可以看到工具提示已被剪切,因此只有"项目#1"是可见的。鼠标从" 1"移动到左边。圆形,工具提示内容已更新为包含9行文本,但其大小保持不变。不幸的是,这些问题似乎是随机发生的,因此您必须“玩”#34;应用程序一段时间后,在圆圈之间移动鼠标。

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

  1. 当我关闭WS_EX_COMPOSITED样式时,问题就会消失
  2. 当我强制工具提示的大小实际改变时(即使移动到具有相同数字的另一个圆圈),问题也会消失
  3. 这表明,当从隐藏状态变为可见状态时,具有WS_EX_COMPOSITED样式的窗口可能无法更新其大小。

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

1 个答案:

答案 0 :(得分:0)

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

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