【问题标题】:Setting ShowInTaskBar = False, causes flicker when closing modeless form in .net, winforms设置 ShowInTaskBar = False,在 .net、winforms 中关闭无模式表单时会导致闪烁
【发布时间】:2010-12-20 02:40:29
【问题描述】:

要重新创建此行为,您需要创建一个具有以下属性的弹出表单:

(1) ShowInTaskBar = 假

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

(3) 为了在鼠标点击离开窗体时关闭窗体,覆盖 OnDeactivate,并将可见设置为 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 的样式常量列表,但我并不聪明。

【问题讨论】:

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


    【解决方案1】:
    -2139095040 = 0x80800000 = WS_POPUP | WS_BORDER
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多