我正在尝试更改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视觉样式的情况下完成它?
答案 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事件处理程序)。