进度条颜色vb.net

时间:2014-02-16 20:12:59

标签: vb.net colors progress-bar

我正在尝试更改vb.net中进度条的前景颜色,有一种方法可以通过禁用XP视觉样式来实现,但我不想这样做,因为这样做会使该应用程序看起来不干净,所以我一直试图找到一种方法使其工作,而不禁用该选项,我找到了一个,但它似乎只有当颜色设置为绿色,如果它设置为红色或黄色时工作进度条没有颜色。这是我发现的代码不起作用的代码:

Public Class Form1

 Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Integer,
          ByVal wMsg As Integer, ByVal wParam As Integer, 
          ByVal lParam As Integer) As Integer

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
       SendMessage(ProgressBar1.Handle, 1040, 2, 0)
       ProgressBar1.Increment(10)
       End Sub
  End Class

这似乎根本不起作用,所以我想知道是否有另一种方法可以在不禁用XP视觉样式的情况下完成它?

1 个答案:

答案 0 :(得分:1)

您可以通过继承ProgressBar类:

来创建自己的自定义进度条
Imports System.Drawing.Drawing2D
Namespace WindowsFormsApplication1
    Class ProgressBarColor
        Inherits System.Windows.Forms.ProgressBar
        Private _Color As Color
        Private brush As New System.Drawing.Drawing2D.LinearGradientBrush(New Rectangle(1, 1, 1, 1), Color.FloralWhite, Color.Firebrick, LinearGradientMode.Vertical)
        Private m_rec As Rectangle
        Private draw As Boolean

        Private indraw As Boolean = True
        Public Sub New()
            MyBase.New()
            Me.SetStyle(System.Windows.Forms.ControlStyles.UserPaint, True)
            _Color = Color.Red
            m_rec = New Rectangle(1, 1, 1, 1)
            draw = False
        End Sub

        <Category("Appearance"), Description("The Color of the progress bar")> _
        <Browsable(True)> _
        Public Property Color() As Color
            Get
                Return _Color
            End Get
            Set
                _Color = value
            End Set
        End Property


        <Category("Behavior"), Description("Whether or not the progress bar should draw itself when the value hasn't changed")> _
        <Browsable(True)> _
        Public Property DrawEveryFrame() As Boolean
            Get
                Return draw
            End Get
            Set
                draw = value
            End Set
        End Property

        Public Property Rec() As Rectangle
            Get
                Return m_rec
            End Get
            Set
                If value.Height = 0 Then
                    value.Height = 1
                End If
                If value.Width = 0 Then
                    value.Width = 1
                End If
                m_rec = value
                brush = New LinearGradientBrush(value, _Color, Color.FromArgb(_Color.R / 2, _Color.G / 2, _Color.B / 2), LinearGradientMode.Vertical)
            End Set
        End Property

        Protected Overrides Sub OnPaintBackground(pevent As PaintEventArgs)

        End Sub

        Protected Overrides Sub OnPaint(e As System.Windows.Forms.PaintEventArgs)
            Dim width As Integer = 0
            If Value <> 0 Then
                width = (e.ClipRectangle.Width * Value \ Maximum) - 4
            End If
            If (m_rec.X <> e.ClipRectangle.X OrElse m_rec.Y <> e.ClipRectangle.Y OrElse m_rec.Width <> width OrElse m_rec.Height <> e.ClipRectangle.Height - 4) OrElse draw OrElse indraw Then
                indraw = False
                Rec = New Rectangle(e.ClipRectangle.X, e.ClipRectangle.Y, Me.Size.Width, Me.Size.Height)
                If m_rec.Height = 0 Then
                    m_rec.Height = 1
                End If
                If ProgressBarRenderer.IsSupported Then
                    ProgressBarRenderer.DrawHorizontalBar(e.Graphics, e.ClipRectangle)
                End If
                m_rec.Width = CInt(m_rec.Width * (CDbl(Value) / Maximum)) - 4
                m_rec.Height -= 4
                If m_rec.Width = 0 Then
                    m_rec.Width = 1
                End If
                e.Graphics.FillRectangle(brush, 2, 2, m_rec.Width, m_rec.Height)
                MyBase.OnPaint(e)
            End If
        End Sub

    End Class
End Namespace

这将在工具箱中创建一个您应该能够在设计时添加的自定义控件。这只是为了让你开始。希望它会有所帮助。 (注意,如果条形图在DrawEveryFrame设置为false时闪烁,您可能需要将LinearGradientBrush更改为标准System.Drawing.Brush;或者从计时器或{4}}调用ProgressBarColor1.Update()或mousemove事件处理程序)。