首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自定义控件(groupbox、picturebox、label) -在鼠标输入时,内部消失

自定义控件(groupbox、picturebox、label) -在鼠标输入时,内部消失
EN

Stack Overflow用户
提问于 2012-09-02 12:58:27
回答 2查看 1K关注 0票数 3

对于这个令人困惑的标题,我很抱歉,这是我的问题。我有一个自定义的GroupBox,里面有一个自定义的picturebox和标签。

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

GroupBox:

代码语言:javascript
复制
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

Label & PictureBox (相同的代码,只是继承了各自的):

代码语言:javascript
复制
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

有人能看到出了什么问题吗?我试着注释掉控件框的OnMouseMove,但没能修复它。我也没有为ControlBox设置任何事件。

EN

回答 2

Stack Overflow用户

发布于 2012-09-02 23:25:43

没有可用的代码,很难说,我有两个建议:

  1. OnMouseMove中的Invalidate更改为Invalidate(True),以便也刷新GroupBox的子控件。子控件可能不会收到绘制消息。
  2. 对于透明控件,您应该在D9中使用SetStyle(ControlStyles.SupportsTransparentBackColor Or ControlStyles.UserPaint, True),而不是在D11中设置D10。在构造函数中将控件设置为不透明时,加上D12表示D13。
票数 3
EN

Stack Overflow用户

发布于 2012-09-07 08:42:52

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

代码语言:javascript
复制
SendMessage(Me.Handle, WM_SETREDRAW, False, 0) ' Turn OFF UI updates

代码语言:javascript
复制
SendMessage(Me.Handle, WM_SETREDRAW, True, 0) ' Turn ON UI updates

我使用它在我的项目中自定义下拉控件,它工作得很好。

根据我的经验,DoubleBuffered是无用的。

要使SendMessage可用,您需要从user32导入它

代码语言:javascript
复制
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内的任何处理(第一行)之前关闭UI更新,并在所有处理完成后重新打开它。还需要在SendMessage(...True...)之后调用Me.Refresh(),否则您将得不到任何更新。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12233527

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档