设置ShowInTaskBar = False,在.net,winforms中关闭无模式窗体时会导致闪烁

时间:2009-11-24 23:57:05

标签: c# .net vb.net winforms flicker

要重新创建此行为,您需要创建一个包含以下属性的弹出窗体:

(1)ShowInTaskBar = False

(2)使用Show方法和循环显示表单,直到表单不可见为止。

(3)为了在单击鼠标时关闭表单,请覆盖OnDeactivate,并将visible设置为False。

接下来,创建另一个表单,在单击按钮时显示弹出窗口:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As Syste
    Using pop As New PopUp
        pop.Visible = True
        Do While pop.Visible
            Application.DoEvents()
            NativeMethods.MsgWaitForMultipleObjectsEx(0, IntPtr.Zero, 250, &HFF, 4)
        Loop
        Me.Activate()
    End Using
End Sub

启动项目,展开表单以填充屏幕,然后单击按钮以打开弹出窗口。 然后单击返回原始表单中的任意位置。 大多数时候,但并非总是如此,原始形态会在再次出现之前瞬间消失 - 从而导致闪烁效应。

深入研究反射器和System.Windows.Forms.Design.DropDownHolder我在CreateParams中找到了解决闪烁问题的以下内容:

createParams.Style = (createParams.Style Or -2139095040)

不幸的是,它还在表单周围放置了黑色边框。 (你必须设置FormBorderStyle = System.Windows.Forms.FormBorderStyle.None才能看到这个。)

除了将黑色边框放在表格周围之外,有没有人知道这种风格会做什么?

我用数字和十六进制等效搜索谷歌,但什么都找不到。

感谢。

ETA:我已经看过pinvoke.net的样式常量列表,但我不是更明智的。

1 个答案:

答案 0 :(得分:3)

-2139095040 = 0x80800000 = WS_POPUP | WS_BORDER

这似乎也是边境的罪魁祸首。