【问题标题】:.Net WinForms application: Form flickers when changing Form.ShowInTaskbar value.Net WinForms 应用程序:更改 Form.ShowInTaskbar 值时表单闪烁
【发布时间】:2016-04-04 04:01:42
【问题描述】:

考虑以下代码:

Me.ShowInTaskbar = Not ShowInTaskbar

每次我调用这行代码时,表单都会闪烁一小段时间(可能取决于表单上有多少控件)。

好的,我为什么要首先运行它?

基本上,我有一个主窗体,我用它来显示一些对话框窗体,我希望能够通过单击任务栏来最小化/恢复这两个窗体(主和对话框),所以我正在使用这个代码:

    Dim dialogForm As New frmDialog
    Me.ShowInTaskbar = False
    dialogForm.ShowDialog(Me)
    Me.ShowInTaskbar = True

在对话框中

Private Sub frmDialog_Resize(sender As Object, e As System.EventArgs) Handles Me.Resize
    frmMain.Visible = Me.WindowState <> FormWindowState.Minimized
End Sub

现在,一切正常除了,每次我启用/禁用 ShowInTaskbar 属性时表单都会闪烁(这对我来说非常重要,因为它会影响我拥有的每个对话框表单)。

有什么办法可以防止这种情况发生吗? 有没有其他方法可以在不触及ShowInTaskbar 属性的情况下处理最小化/恢复事物?

(我找到了一些讨论这个的话题,但我找不到任何有用的解决方案)。

注意: 我不想隐藏主窗体或使其可点击

【问题讨论】:

  • 不相关但为什么要检查 Resize 事件?您有一个特定的窗口状态更改
  • 一个特定的事件?哪个是?!
  • 当窗口状态改变时,Windows 将向您的表单发送 WM_SYSCOMMAND,覆盖 WndPrc 并使用 wParam 为 SC_MINIMIZE、SC_MAXIMIZE 和 SC_RESTORE 检查该命令。
  • 您正在创建一个未使用的 frmDialog 实例 (dialogForm),对吗?也许您正在看到它的两个实例的结果。
  • @user34660 不,这只是这个例子中的一个错误(在原始代码中不是这种情况),我已经对其进行了编辑.. 感谢您的注意:)

标签: .net vb.net winforms


【解决方案1】:

在表单中编写以下代码 -

Private originalExStyle As Integer = -1
Private enableFormLevelDoubleBuffering As Boolean = True

Protected Overrides ReadOnly Property CreateParams() As CreateParams
    Get
        If originalExStyle = -1 Then
            originalExStyle = MyBase.CreateParams.ExStyle
        End If

        Dim cp As CreateParams = MyBase.CreateParams

        If enableFormLevelDoubleBuffering Then
            cp.ExStyle = cp.ExStyle Or &H2000000
        Else
            ' WS_EX_COMPOSITED

            cp.ExStyle = originalExStyle
        End If
        Return cp
    End Get
End Property

请在此处找到更多详细信息 - http://www.angryhacker.com/blog/archive/2010/07/21/how-to-get-rid-of-flicker-on-windows-forms-applications.aspx

【讨论】:

  • 我添加了 override 属性和TurnOffFormLevelDoubleBuffering 方法,并在Form_Shown 事件中调用了该方法,如文章中所述。不幸的是它仍然闪烁!
猜你喜欢
  • 1970-01-01
  • 2021-12-04
  • 1970-01-01
  • 1970-01-01
  • 2011-04-18
  • 2013-04-26
  • 2020-08-17
  • 2010-12-20
  • 1970-01-01
相关资源
最近更新 更多