技术 - Visual Basic - 带进度条的ListView,在SubItem中显示Progress

04
09 Jun.

带进度条的ListView,在SubItem中显示Progress

最后更新: 2009/06/04  |  评论: 0  |  关键词: ListView  Progress  SubItem  进度条  重绘  

上一版本虽然实现了进度条效果,但是还是不理想,毕竟全部重绘,如果自己不绘上,原汁原味的效果就丢失了,所以后来又继续 Google 一下,发现了关于文章讲直接重载绘图函数,重绘 SubItem 就行了,今天再次尝试一下,果然 OK 了,一个字“爽”!

  1. '--------------------------------------------------     
  2. '     
  3. '   窗体 - 带进度条的 ListView  
  4. '     
  5. '   namespace: WoodCoal.Library.Windows.Forms.ListViewProgress  
  6. '   author: 木炭(WoodCoal)     
  7. '   homepage: http://www.woodcoal.cn/     
  8. '   memo: 带进度条的 ListView  
  9. '   release: 2009-06-04  
  10. '     
  11. '--------------------------------------------------   
  12.  
  13. Namespace Windows.Forms  
  14.     Public Class ListViewProgress  
  15.         Inherits System.Windows.Forms.ListView  
  16.  
  17.         ''' <summary>进度条内容</summary>  
  18.         Private _ProgressText As String 
  19.  
  20.         ''' <summary>进度条背景色</summary>  
  21.         Private _ProgressBackColor As Drawing.Color  
  22.  
  23.         ''' <summary>进度条文字色</summary>  
  24.         Private _ProgressTextColor As Drawing.Color  
  25.  
  26.         ''' <summary>进度条的序列</summary>  
  27.         Private _ProgressColumnIndex As Integer = -1  
  28.  
  29.         '----------------------------------------------------------------  
  30.  
  31.         Public Sub New()  
  32.             Me.Name = "ProgressListView" 
  33.             Me.ProgressBackColor = Drawing.Color.YellowGreen  
  34.             Me.ProgressTextColor = MyBase.ForeColor  
  35.  
  36.             MyBase.OwnerDraw = True 
  37.         End Sub 
  38.  
  39.  
  40.         '----------------------------------------------------------------  
  41.  
  42.         ''' <summary>进度条背景色</summary>  
  43.         Public Property ProgressBackColor() As Drawing.Color  
  44.             Get 
  45.                 Return _ProgressBackColor  
  46.             End Get 
  47.             Set(ByVal value As Drawing.Color)  
  48.                 _ProgressBackColor = value  
  49.             End Set 
  50.         End Property 
  51.  
  52.         ''' <summary>进度条文字色</summary>  
  53.         Public Property ProgressTextColor() As Drawing.Color  
  54.             Get 
  55.                 Return _ProgressTextColor  
  56.             End Get 
  57.             Set(ByVal value As Drawing.Color)  
  58.                 _ProgressTextColor = value  
  59.             End Set 
  60.         End Property 
  61.  
  62.         ''' <summary>进度条的序列</summary>  
  63.         Public Property ProgressColumnIndex() As Integer 
  64.             Get 
  65.                 Return _ProgressColumnIndex  
  66.             End Get 
  67.             Set(ByVal value As Integer)  
  68.                 _ProgressColumnIndex = value  
  69.             End Set 
  70.         End Property 
  71.  
  72.         '----------------------------------------------------------------  
  73.  
  74.         Protected Overloads Overrides Sub OnDrawColumnHeader(ByVal e As System.Windows.Forms.DrawListViewColumnHeaderEventArgs)  
  75.             e.DrawDefault = True 
  76.             MyBase.OnDrawColumnHeader(e)  
  77.         End Sub 
  78.  
  79.         Protected Overloads Overrides Sub OnDrawSubItem(ByVal e As System.Windows.Forms.DrawListViewSubItemEventArgs)  
  80.             If e.ColumnIndex = Me.ProgressColumnIndex Then 
  81.                 '画进度条  
  82.                 Dim ProgressGraphics As Drawing.Graphics = e.Graphics  
  83.                 Dim ProgressRect As New Drawing.Rectangle(e.Bounds.Left, e.Bounds.Top, e.Bounds.Width, e.Bounds.Height)  
  84.  
  85.                 If ProgressRect.Height > 6 AndAlso ProgressRect.Width > 6 Then 
  86.                     '调整为新的区域,以便产生一定的间距  
  87.                     ProgressRect = New Drawing.Rectangle(ProgressRect.Left + 2, ProgressRect.Top + 2, ProgressRect.Width - 5, ProgressRect.Height - 5)  
  88.  
  89.                     Dim Percent As Single = 0  
  90.                     If Common.String.Validate.Number(e.SubItem.Text) Then 
  91.                         Percent = Single.Parse(e.SubItem.Text)  
  92.                         If Percent >= 1.0F Then Percent = Percent / 100.0F  
  93.                     End If 
  94.  
  95.                     '外框  
  96.                     ProgressGraphics.FillRectangle(Drawing.Brushes.White, ProgressRect)  
  97.                     ProgressGraphics.DrawRectangle(New Drawing.Pen(e.SubItem.ForeColor), ProgressRect)  
  98.  
  99.                     '内容  
  100.                     Dim ProgressContentRect As New Drawing.Rectangle(ProgressRect.Left + 1, ProgressRect.Top + 1, CInt((ProgressRect.Width * Percent)) - 1, ProgressRect.Height - 1)  
  101.                     ProgressGraphics.FillRectangle(New Drawing.SolidBrush(_ProgressBackColor), ProgressContentRect)  
  102.  
  103.                     '输出文字  
  104.                     If e.SubItem.Font.Height < ProgressRect.Height Then 
  105.                         ProgressRect = New Drawing.Rectangle(ProgressRect.Left, ProgressRect.Top - Int(-(ProgressRect.Height - e.SubItem.Font.Height) / 2), ProgressRect.Width, e.SubItem.Font.Height)  
  106.                     Else 
  107.                         ProgressRect = New Drawing.Rectangle(ProgressRect.Left + 1, ProgressRect.Top + 1, ProgressRect.Width - 1, ProgressRect.Height - 1)  
  108.                     End If 
  109.                     Using StringFormat As New Drawing.StringFormat  
  110.                         StringFormat.Alignment = Drawing.StringAlignment.Center  
  111.                         StringFormat.LineAlignment = Drawing.StringAlignment.Center  
  112.                         StringFormat.Trimming = Drawing.StringTrimming.EllipsisCharacter  
  113.  
  114.                         e.Graphics.DrawString(Percent.ToString("p1"), e.SubItem.Font, New System.Drawing.SolidBrush(Me.ProgressTextColor), ProgressRect, StringFormat)  
  115.                     End Using  
  116.                 End If 
  117.  
  118.                 MyBase.OnDrawSubItem(e)  
  119.             Else 
  120.                 e.DrawDefault = True 
  121.                 MyBase.OnDrawSubItem(e)  
  122.             End If 
  123.         End Sub 
  124.     End Class 
  125. End Namespace 

使用很简单,和上版一样,创建 WoodCoal.Library.Windows.Forms.ListViewProgress 对象,其余使用和原版 ListView 一样,参数也那样的设置,只是最后指定一下滚动条所在的列: Object.ProgressColumnIndex

· 本文由 木炭 发布在《激情燃烧的木炭》 上,原文地址为:http://www.woodcoal.cn/technology/visual-basic/200964-23510-501.html(转载请保留本信息、全文内容和链接)

发表评论

已经有 0 位朋友发表了对《带进度条的ListView,在SubItem中显示Progress》的看法
 
登录名:  密码:   登录  注册
评论: 
User:
Contact:
验证码:  
  [Ctrl+Enter]

关于本文