原发问问题:
 
章老师你好,想请问你有关于listview显示大图标的问题,我在p_w_picpathlist放入我要显示的图片后,由于p_w_picpathlist的大小设定,让显示的图片并不会等比例缩小,我做成跟文件总管一样的缩图功能,图片能比例缩小,且显示的质量也比较好,该如何下手,目前卡关中@@thanks
 
解答:
 
亲爱的读者您好,很感谢您对于章立民研究室的支持,有关于您提到的问题,回复如下。
答读者问_第1张图片
                         图表1
答读者问_第2张图片
                               图表2
答读者问_第3张图片
                                    图表3
图表 1 3 所示者是程序范例的执行画面,它示范如何使用 ImageList 对象来管理加载的 Image 对象,由 ListBox 控件来决定显示的图片缩图内容,相关程序设计技巧说明如下:
 
首先,于窗体的 Load 事件处理程序中撰写下列程序代码,以便建立 ImageList 类别实体对象,并设定相关属性,让缩图以 200*200 的影像高度与宽度大小、 16Bit 的颜色深度显示:

Protected myGraphics As Graphics
Private currentImage As Integer = 0

Private Sub Form012_Load( _
  ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
  ImageList1 = New ImageList()
 
  ' 定义列表中的影像高度和宽度。
  ImageList1.ImageSize = New Size(200, 200)
  ImageList1.ColorDepth = ColorDepth.Depth16Bit
End Sub
 
当您按下「加入图像文件案」按钮,便会显示「开启文件」对话框,并呼叫用户自定义程序 addImage() ,以便将用户所选取的文件加入 ImageList 对象,同时更新 ListBox 控件显示的项目列表,程序代码如下所示:
 
' 加入图像文件案按钮 Click 事件处理程序。
Private Sub Button4_Click( _
  ByVal sender As Object, ByVal e As System.EventArgs) Handles Button4.Click
  OpenFileDialog1.Multiselect = True
 
  If OpenFileDialog1.ShowDialog() = DialogResult.OK Then
    If OpenFileDialog1.FileNames IsNot Nothing Then
      Dim i As Integer
      For i = 0 To OpenFileDialog1.FileNames.Length – 1
        addImage(OpenFileDialog1.FileNames(i))
      Next i
    Else
      addImage(OpenFileDialog1.FileName)
    End If
    
    ListBox1.SelectedIndex = 0
  End If
End Sub

刚刚我们提到,用户自定义程序 addImage() 是用来将用户选取的影像加入 ImageList 对象,并将文件名新增至 ListBox 控件,以下是程序代码内容:

Private Sub addImage(ByVal p_w_picpathToLoad As String)
  If p_w_picpathToLoad <> "" Then
    p_w_picpathList1.Images.Add(Image.FromFile(p_w_picpathToLoad))
    listBox1.BeginUpdate()
    listBox1.Items.Add(p_w_picpathToLoad)
    listBox1.EndUpdate()
  End If
End Sub
 
当您按下「显示下一张图片」按钮,便会取得 ListBox 控件列表中目前所选取项目的索引,藉以计算出下一个项目的索引值,以便将索引值传递给 ImageList 对象,让 PictureBox 控件显示正确的图片:
 
' 显示下一张图片按钮 Click 事件处理程序。
Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) _
  Handles Button1.Click
  If ImageList1.Images.Empty <> True Then
    If ImageList1.Images.Count - 1 > currentImage Then
      currentImage += 1
    Else
      currentImage = 0
    End If
    
    ' PictureBox 控件中显示图片。
    PictureBox1.Image = ImageList1.Images(currentImage)
    
    Label3.Text = " 目前显示的图片是: " + currentImage.ToString
    ListBox1.SelectedIndex = currentImage
    Label5.Text = " 图片索引: " + ListBox1.Text
  End If
End Sub
 
ListBox 控件的 SelectedIndexChanged 事件处理程序撰写下列程序代码,当用户选取不同的列表项目时,让 PictureBox 控件显示 ImageList 对象对应的图片:

Private Sub ListBox1_SelectedIndexChanged( _
  ByVal sender As System.Object, ByVal e As System.EventArgs) _
  Handles ListBox1.SelectedIndexChanged
  If ListBox1.SelectedIndex <> -1 Then
    currentImage = ListBox1.SelectedIndex
   
    ' PictureBox 控件中显示图片。
    PictureBox1.Image = ImageList1.Images(ListBox1.SelectedIndex)
   
    Label3.Text = " 目前显示的图片是: " + currentImage.ToString
    Label5.Text = " 图片索引: " + ListBox1.Text
  End If
End Sub

当您按下「移除图片」按钮,便会取得 ListBox 控件列表中目前所选取索引,根据索引与对应索引的项目来删除 ImageList 对象以及 ListBox 控件对应的列表项目,并改变 Label 控件显示的消息正文,程序代码如下所示:
 
' 移除图片按钮 Click 事件处理程序。
Private Sub Button2_Click(ByVal sender As Object, ByVal e As System.EventArgs) _
  Handles Button2.Click
  If ListBox1.SelectedIndex <> -1 Then
    ImageList1.Images.RemoveAt(ListBox1.SelectedIndex)
    ListBox1.Items.Remove(ListBox1.SelectedItem)
    PictureBox1.Image = Nothing
    Label3.Text = Nothing
    Label5.Text = Nothing
  End If
End Sub

当您按下「清除列表」按钮,便会清除 ListBox 控件所有的列表项目,并改变 Label 控件显示的消息正文:
 
' 清除列表按钮 Click 事件处理程序。
Private Sub Button3_Click(ByVal sender As Object, ByVal e As System.EventArgs) _
  Handles Button3.Click
  ImageList1.Images.Clear()
  ListBox1.Items.Clear()
  PictureBox1.Image = Nothing
  Label3.Text = Nothing
  Label5.Text = Nothing
End Sub