自定义控件(组框,图片框,标签) - 在鼠标输入时,内部消失

时间:2012-09-02 04:58:27

标签: .net vb.net groupbox

对于那个令人困惑的标题感到抱歉,这是我的问题。我有一个自定义的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

标签& PictureBox(相同的代码,只是继承了相应的代码):

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设置任何事件。

2 个答案:

答案 0 :(得分:3)

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

  1. Invalidate中的OnMouseMove更改为Invalidate(True),这样GroupBox的孩子也会得到更新。子控件可能无法获得绘制消息。

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

答案 1 :(得分: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
PaintHook

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