04
09 Jun.
带进度条的ListView,在SubItem中显示Progress
最后更新: 2009/06/04 | 评论: 0 | 关键词: ListView Progress SubItem 进度条 重绘
上一版本虽然实现了进度条效果,但是还是不理想,毕竟全部重绘,如果自己不绘上,原汁原味的效果就丢失了,所以后来又继续 Google 一下,发现了关于文章讲直接重载绘图函数,重绘 SubItem 就行了,今天再次尝试一下,果然 OK 了,一个字“爽”!
- '--------------------------------------------------
- '
- ' 窗体 - 带进度条的 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.Top + 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
使用很简单,和上版一样,创建 WoodCoal.Library.Windows.Forms.ListViewProgress 对象,其余使用和原版 ListView 一样,参数也那样的设置,只是最后指定一下滚动条所在的列: Object.ProgressColumnIndex
· 本文由 木炭 发布在《激情燃烧的木炭》 上,原文地址为:http://www.woodcoal.cn/technology/visual-basic/200964-23510-501.html(转载请保留本信息、全文内容和链接)
关于本文
- 作者:
- 来源:
- 时间:2009/06/04
- 关键词:ListView Progress SubItem 进度条 重绘
- 栏 目:Visual Basic
- 上一篇:没有了
- 下一篇:带进度条的ListView,在Item中直接画Progress
发表评论