【问题标题】:Progress bar colour vb.net [duplicate]进度条颜色vb.net [重复]
【发布时间】:2014-02-16 20:12:59
【问题描述】:

我正在尝试更改 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 视觉样式的情况下做到这一点?

【问题讨论】:

标签: vb.net colors progress-bar


【解决方案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;或者,从计时器或 mousemove 事件处理程序调用 ProgressBarColor1.Update()

【讨论】:

  • 那么我应该将它添加到我的 form1 还是单独的类中? @davidsbro
  • 将此添加到您的表单1,但作为一个单独的类,它将在工具箱中可用。
  • @user2387537,如果这回答了您的问题,请随意标记。
  • 我发现只需将样式设置为Marquee 即可停止闪烁
猜你喜欢
  • 2011-08-11
  • 2012-12-22
  • 2015-09-19
  • 2017-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多