'--------------------------------------------------
'
' 窗体 - 带进度条的 ListView
'
' namespace: WoodCoal.Library.Windows.Forms.ListViewProgress
' author: 木炭(WoodCoal)
' homepage: http://www.woodcoal.cn/
' memo: 带进度条的 ListView
' release: 2009-06-04
'
'--------------------------------------------------
Namespace Windows.Forms
Public Class ListViewProgress
Inherits System.Windows.Forms.ListView
''' <summary>进度条内容</summary>
Private _ProgressText As String
''' <summary>进度条背景色</summary>
Private _ProgressBackColor As Drawing.Color
''' <summary>进度条文字色</summary>
Private _ProgressTextColor As Drawing.Color
''' <summary>进度条的序列</summary>
Private _ProgressColumnIndex As Integer = -1
'----------------------------------------------------------------
Public Sub New()
Me.Name = "ProgressListView"
Me.ProgressBackColor = Drawing.Color.YellowGreen
Me.ProgressTextColor = MyBase.ForeColor
MyBase.OwnerDraw = True
End Sub
'----------------------------------------------------------------
''' <summary>进度条背景色</summary>
Public Property ProgressBackColor() As Drawing.Color
Get
Return _ProgressBackColor
End Get
Set(ByVal value As Drawing.Color)
_ProgressBackColor = value
End Set
End Property
''' <summary>进度条文字色</summary>
Public Property ProgressTextColor() As Drawing.Color
Get
Return _ProgressTextColor
End Get
Set(ByVal value As Drawing.Color)
_ProgressTextColor = value
End Set
End Property
''' <summary>进度条的序列</summary>
Public Property ProgressColumnIndex() As Integer
Get
Return _ProgressColumnIndex
End Get
Set(ByVal value As Integer)
_ProgressColumnIndex = value
End Set
End Property
'----------------------------------------------------------------
Protected Overloads Overrides Sub OnDrawColumnHeader(ByVal e As
System.Windows.Forms.DrawListViewColumnHeaderEventArgs)
e.DrawDefault = True
MyBase.OnDrawColumnHeader(e)
End Sub
Protected Overloads Overrides Sub OnDrawSubItem(ByVal e As
System.Windows.Forms.DrawListViewSubItemEventArgs)
If e.ColumnIndex = Me.ProgressColumnIndex Then
'画进度条
Dim ProgressGraphics As Drawing.Graphics = e.Graphics
Dim ProgressRect As New Drawing.Rectangle(e.Bounds.Left,e.Bounds.Top,e.Bounds.Width,
e.Bounds.Height)
If ProgressRect.Height > 6 AndAlso ProgressRect.Width > 6 Then
'调整为新的区域,以便产生一定的间距
ProgressRect = New Drawing.Rectangle(ProgressRect.Left + 2,ProgressRect.Top + 2,
ProgressRect.Width - 5,ProgressRect.Height - 5)
Dim Percent As Single = 0
If Common.String.Validate.Number(e.SubItem.Text) Then
Percent = Single.Parse(e.SubItem.Text)
If Percent >= 1.0F Then Percent = Percent / 100.0F
End If
'外框
ProgressGraphics.FillRectangle(Drawing.Brushes.White,ProgressRect)
ProgressGraphics.DrawRectangle(New Drawing.Pen(e.SubItem.ForeColor),ProgressRect)
'内容
Dim ProgressContentRect As New Drawing.Rectangle(ProgressRect.Left + 1,ProgressRect.Top + 1,
CInt((ProgressRect.Width * Percent)) - 1,ProgressRect.Height - 1)
ProgressGraphics.FillRectangle(New Drawing.SolidBrush(_ProgressBackColor),
ProgressContentRect)
'输出文字
If e.SubItem.Font.Height < ProgressRect.Height Then
ProgressRect = New Drawing.Rectangle(ProgressRect.Left,ProgressRect.Top - Int(-
(ProgressRect.Height - e.SubItem.Font.Height) / 2),ProgressRect.Width,e.SubItem.Font.Height)
Else
ProgressRect = New Drawing.Rectangle(ProgressRect.Left + 1,
ProgressRect.Width - 1,ProgressRect.Height - 1)
End If
Using StringFormat As New Drawing.StringFormat
StringFormat.Alignment = Drawing.StringAlignment.Center
StringFormat.LineAlignment = Drawing.StringAlignment.Center
StringFormat.Trimming = Drawing.StringTrimming.EllipsisCharacter
e.Graphics.DrawString(Percent.ToString("p1"),e.SubItem.Font,New
System.Drawing.SolidBrush(Me.ProgressTextColor),ProgressRect,StringFormat)
End Using
End If
MyBase.OnDrawSubItem(e)
Else
e.DrawDefault = True
MyBase.OnDrawSubItem(e)
End If
End Sub
End Class
End Namespace
原文来源:“激情燃烧的木炭” http://www.woodcoal.cn/
原文标题:<SPAN style="color:#FF0000">带进度条的ListView,在SubItem中显示Progress</SPAN> - Visual Basic[激情燃烧的
木炭]
原文地址:http://www.woodcoal.cn/technology/visual-basic/200964-23510-781.html