3

非常に紛らわしいタイトルで申し訳ありませんが、これが私の問題です。カスタム グループ ボックスがあり、その中にカスタム ピクチャ ボックスとラベルがあります。

問題は、マウスが 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

Label & 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 にイベントを設定していません。

4

2 に答える 2

3

コードが機能しないと言うのは難しいですが、2つの提案があります。

  1. に変更InvalidateするOnMouseMoveInvalidate(True)GroupBox子供たちもリフレッシュされます。子コントロールはペイントメッセージを受け取らない場合があります。

  2. 透過的なコントロールの場合は、 inを設定するのではなく、SetStyle(ControlStyles.SupportsTransparentBackColor Or ControlStyles.UserPaint, True)Inを使用する必要があります。Plusは、コンストラクターでコントロールを不透明に設定することを意味します。OnHandleCreatedExStyleCreateParams&H20WS_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

PaintHook内部で処理を行う前(最初の行) にUI の更新をオフにし、すべての処理が完了したらオンに戻します。Me.Refresh()また、 afterを呼び出す必要がありSendMessage(...True...)ます。そうしないと、更新がまったく得られません。

于 2012-09-07T00:42:51.680 に答える