VB.NET取得檔案ICON圖片檔
前言
看到余小章@大內殿堂裡面的,仿檔案總管, 心想也要做做看,發揮菜鳥精神,但還沒做之前先冥想一下,發覺檔案圖片是診取得的,所以就查出以下方法。
畫面
設計畫面
使用狀況
第一種方式,正常顯示
第二種方式,要取得資料夾Icon就會發生錯誤
程式部分
Imports System.IO
Public Class Form1
Private Structure SHFILEINFO
Public hIcon As IntPtr ' : icon
Public iIcon As Integer ' : icondex
Public dwAttributes As Integer ' : SFGAO_ flags
<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=260)> Public szDisplayName As String
<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=80)> Public szTypeName As String
End Structure
Private Declare Ansi Function SHGetFileInfo Lib "shell32.dll" (ByVal pszPath As String, _
ByVal dwFileAttributes As Integer, ByRef psfi As SHFILEINFO, ByVal cbFileInfo As Integer, _
ByVal uFlags As Integer) As IntPtr
Private Const SHGFI_ICON = &H100
Private Const SHGFI_SMALLICON = &H1
Private Const SHGFI_LARGEICON = &H0 ' Large icon
Private nIndex = 0
'第一種方法
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim hImgSmall As IntPtr 'The handle to the system image list.
Dim hImgLarge As IntPtr 'The handle to the system image list.
Dim shinfo As SHFILEINFO
Dim nIndex As Integer = 0
Dim file As FileInfo
shinfo = New SHFILEINFO()
'設定ListView顯示方式
Me.ListView1.View = View.Details
Me.ListView1.SmallImageList = Me.ImageList1
Me.ListView1.Columns.Add("檔案名稱", 200, HorizontalAlignment.Left)
Me.ListView1.Columns.Add("修改日期", 200, HorizontalAlignment.Left)
'寫入第一筆 取得檔案ICON
file = New FileInfo("D:\Visio圖型\Web\nick_finck_processflow.vss")
If Not ImageList1.Images.ContainsKey(file.Extension) Then
hImgSmall = SHGetFileInfo(file.FullName, 0, shinfo, Marshal.SizeOf(shinfo), _
SHGFI_ICON Or SHGFI_LARGEICON)
Dim myIcon As System.Drawing.Icon
myIcon = System.Drawing.Icon.FromHandle(shinfo.hIcon)
ImageList1.Images.Add(file.Extension, myIcon) 'Add icon to imageList.
End If
Dim lvItem As New ListViewItem(file.Name, file.Extension)
lvItem.SubItems.Add(file.LastWriteTime)
Me.ListView1.Items.Add(lvItem)
'寫入第二筆 取得資料夾ICON
Dim dir = New DirectoryInfo("D:\Visio圖型\Web")
hImgSmall = SHGetFileInfo(dir.FullName, 0, shinfo, Marshal.SizeOf(shinfo), _
SHGFI_ICON Or SHGFI_LARGEICON)
Dim myIcon2 As System.Drawing.Icon
myIcon2 = System.Drawing.Icon.FromHandle(shinfo.hIcon)
ImageList1.Images.Add("dir", myIcon2) 'Add icon to imageList.
Dim lvItem2 As New ListViewItem(file.Name, "dir")
lvItem2.SubItems.Add(file.LastWriteTime)
Me.ListView1.Items.Add(lvItem2)
End Sub
'第二種方法
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Dim myICon, myICon2 As System.Drawing.Icon
'設定ListView顯示方式
Me.ListView2.View = View.Details
Me.ListView2.SmallImageList = Me.ImageList1
Me.ListView2.Columns.Add("檔案名稱", 200, HorizontalAlignment.Left)
Me.ListView2.Columns.Add("修改日期", 200, HorizontalAlignment.Left)
'寫入第一筆 取得檔案Icon
Dim File As FileInfo = New FileInfo("D:\Visio圖型\Web\nick_finck_processflow.vss")
If Not ImageList2.Images.ContainsKey(File.Extension) Then
myICon = System.Drawing.Icon.ExtractAssociatedIcon(File.FullName)
ImageList2.Images.Add(File.Extension, myICon) 'Add icon to imageList.
End If
Dim lvItem As New ListViewItem(File.Name, File.Extension)
lvItem.SubItems.Add(File.LastWriteTime)
Me.ListView2.Items.Add(lvItem)
'寫入第二筆 取得資料夾ICON
Dim dir = New DirectoryInfo("D:\Visio圖型\Web")
myICon2 = System.Drawing.Icon.ExtractAssociatedIcon(dir)
ImageList2.Images.Add("dir", myICon2) 'Add icon to imageList.
Dim lvItem2 As New ListViewItem(File.Name, "dir")
lvItem2.SubItems.Add(File.LastWriteTime)
Me.ListView2.Items.Add(lvItem2)
End Sub
End Class
結語
第一種方式感覺很麻煩,但卻確可完整取得系統檔案圖示,第二種方式,使用起來較為直覺,
是我比較喜歡方式,但唯獨遺憾的,無法取的資料夾Icon,希望各位高手可以教教我,取得資料夾Icon更
方便的方法。謝謝
Louis的標籤: VB.NET