3

对不起,这个非常混乱的标题,这是我的问题。我有一个自定义的 GroupBox,里面是一个自定义的图片框和标签。

问题是,当我在鼠标进入 GroupBox 时启动表单应用程序时,我的标签字体颜色变为黑色,并且我的图片框似乎“消失”了。我不知道为什么会这样。

组框:

Class GhostGroupBox
    Inherits ThemeControl154

    Sub New()
        MyBase.New()
        SetStyle(ControlStyles.ResizeRedraw, True)
        SetStyle(ControlStyles.ContainerControl, True)
        DoubleBuffered = True
        BackColor = Color.Transparent
    End Sub

    Protected Overrides Sub ColorHook()

    End Sub

    Protected Overrides Sub PaintHook()
        G.Clear(Color.FromArgb(60, 60, 60))
        Dim asdf As HatchBrush
        asdf = New HatchBrush(HatchStyle.DarkDownwardDiagonal, Color.FromArgb(35, Color.Black), Color.FromArgb(0, Color.Gray))
        G.FillRectangle(New SolidBrush(Color.FromArgb(60, 60, 60)), New Rectangle(0, 0, Width, Height))
        asdf = New HatchBrush(HatchStyle.LightDownwardDiagonal, Color.DimGray)
        G.FillRectangle(asdf, 0, 0, Width, Height)
        G.FillRectangle(New SolidBrush(Color.FromArgb(230, 20, 20, 20)), 0, 0, Width, Height)
        G.FillRectangle(New SolidBrush(Color.FromArgb(70, Color.Black)), 1, 1, Width - 2, Me.CreateGraphics.MeasureString(Text, Font).Height + 8)

        G.DrawLine(New Pen(Color.FromArgb(90, 90, 90)), 1, Me.CreateGraphics.MeasureString(Text, Font).Height + 8, Width - 2, Me.CreateGraphics.MeasureString(Text, Font).Height + 8)

        DrawBorders(Pens.Black)
        DrawBorders(New Pen(Color.FromArgb(90, 90, 90)), 1)
        G.DrawString(Text, Font, Brushes.White, 5, 5)
    End Sub
End Class

标签和图片框(相同的代码,只是继承各自的):

Public Class TransparentLabel
    Inherits Label

    Public Sub New()
        Me.SetStyle(ControlStyles.Opaque, True)
        Me.SetStyle(ControlStyles.OptimizedDoubleBuffer, False)
    End Sub

    Protected Overrides ReadOnly Property CreateParams() As CreateParams
        Get
            Dim parms As CreateParams = MyBase.CreateParams
            parms.ExStyle = parms.ExStyle Or &H20
            ' Turn on WS_EX_TRANSPARENT
            Return parms
        End Get
    End Property

End Class

有人能看出有什么问题吗?我尝试将 ControlBox 的 OnMouseMove 注释掉,但没有解决。我也没有为 ControlBox 设置任何事件。

4

2 回答 2

3

没有工作代码很难说,我有两个建议:

  1. 换上soInvalidate的孩子们也神清气爽OnMouseMove。子控件可能不会收到绘制消息。Invalidate(True)GroupBox

  2. 对于透明控件,您应该使用SetStyle(ControlStyles.SupportsTransparentBackColor Or ControlStyles.UserPaint, True)InOnHandleCreated而不是设置ExStylein CreateParams。Plus&H20表示WS_EX_TRANSPARENT在构造函数中将控件设置为不透明。

于 2012-09-02T15:25:42.673 回答
1

我有另一个建议——克隆你的项目并尝试在那里简化你的代码,直到它仍然存在问题,但足够通用,你可以在这里发布它。此外,您没有描述所有自定义控件应该做什么。除此之外,您是否尝试过以下方法来减少闪烁?

SendMessage(Me.Handle, WM_SETREDRAW, False, 0) ' Turn OFF UI updates

SendMessage(Me.Handle, WM_SETREDRAW, True, 0) ' Turn ON UI updates

我将它用于我的项目中的自定义下拉控件,并且效果很好。

DoubleBuffered根据我的经验,没用。

为了SendMessage可用,您需要从以下位置导入它user32

Private Const WM_SETREDRAW As Integer = &HB
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal handle As IntPtr, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer

您将在内部进行任何处理(第一行)之前关闭 UI 更新PaintHook,并在所有处理完成后重新打开它。还需要调用Me.Refresh()after SendMessage(...True...),否则您将根本得不到更新。

于 2012-09-07T00:42:51.680 回答