Duke49
Messages postés552Date d'inscriptionjeudi 12 octobre 2006StatutNon membreDernière intervention24 janvier 2023
-
1 juin 2013 à 18:11
Duke49
Messages postés552Date d'inscriptionjeudi 12 octobre 2006StatutNon membreDernière intervention24 janvier 2023
-
2 juin 2013 à 13:21
Bonjour à toute la communauté !!!
J'ai fait un composant personnalisé, hérité d'une listview que j'ai adapté pour ajouter des fichiers en affichant son icone sur la même ligne.
Bref... Depuis que je l'ai transféré de ma Form en Composant, il ne m'affiche plus rien pourtant j'ai bien désactivé le OwnerDraw.
Merci d'avance pour votre aide, je sèche ^^
Le composant:
Imports System.Drawing.Drawing2D
Imports System.ComponentModel
Imports System.Runtime.InteropServices
Public Class ListViewExplorer
Inherits ListView
Private Structure SHFILEINFO
Public hIcon As IntPtr
Public iIcon As Integer
Public dwAttributes As Integer
<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
Private nIndex = 0
Public Sub New()
MyBase.New()
MyBase.OwnerDraw = False
MyBase.View = View.Details
MyBase.FullRowSelect = True
MyBase.SmallImageList = MyClass.ImageListExplorer
MyBase.Font = New Font("Verdana", 8)
MyBase.BackColor = Color.White
MyBase.ForeColor = Color.Black
MyBase.HeaderStyle = ColumnHeaderStyle.None
MyBase.Scrollable = True
End Sub
Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
MyBase.WndProc(m)
End Sub
#Region "Public Fonctions"
Public Sub _RefreshColumn()
MyBase.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize)
End Sub
Public Sub _AppendAny(ByVal any As String)
Dim extkey As String = CatchExtension(any)
If MyClass.ImageListExplorer.Images.ContainsKey(extkey) = False Then
'Me.ImageListExplorer.Images.Add(extkey, Icon.ExtractAssociatedIcon(any))
MyClass.ImageListExplorer.Images.Add(extkey, GetSHIcon(any))
End If
MyBase.Items.Add(any, extkey)
End Sub
Private Function GetSHIcon(ByVal any As String) As Icon
Dim hImgSmall As IntPtr
Dim shinfo As SHFILEINFO = New SHFILEINFO
hImgSmall = SHGetFileInfo(any, 0, shinfo, Marshal.SizeOf(shinfo), SHGFI_ICON Or SHGFI_SMALLICON)
Dim myIcon As Icon = System.Drawing.Icon.FromHandle(shinfo.hIcon)
Return myIcon
End Function
Private Function CatchExtension(ByVal any) As String
Dim ext As String = IO.Path.GetExtension(any)
If ext = "" Then Return "file"
Return ext.ToUpper
End Function
#End Region
#Region "Properties"
Private ImageListEx As New ImageList
Property ImageListExplorer() As ImageList
Get
Return ImageListEx
End Get
Set(ByVal value As ImageList)
ImageListEx = value
Invalidate()
End Set
End Property
#End Region
#Region "Mouse Events"
Private Sub ListViewExplorer_MouseHover(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.MouseHover
If MyBase.ContainsFocus Or MyBase.CanFocus And Not MyBase.Focused Then
MyBase.Focus()
End If
End Sub
Private Sub ListViewExplorer_MouseLeave(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.MouseLeave
Invalidate()
End Sub
#End Region
End Class
Pour l'utilisation (sur un bouton):
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim diag As New OpenFileDialog
Dim rt As String()
diag.CheckFileExists = True
diag.CheckPathExists = True
diag.Multiselect = True
diag.DefaultExt = "*.*"
diag.Filter = "Tous les fichiers (*.*)|*.*"
diag.DereferenceLinks = False
diag.Title = "Sélectionnez vos fichiers sources"
If diag.ShowDialog = DialogResult.OK Then
If Not diag.FileName = "" Then
rt = diag.FileNames
For Each file As String In rt
Me.ListViewExplorer1._AppendAny(file)
Next
Me.ListViewExplorer1._RefreshColumn()
End If
End If
End Sub
Duke49
Messages postés552Date d'inscriptionjeudi 12 octobre 2006StatutNon membreDernière intervention24 janvier 20234 2 juin 2013 à 13:21
MDR ^^
Si vous avez une listview avec le paramètre view.details et que les données que vous ajoutez ne s'affichent pas...
Bah c'est tout bête... comme moi ^^.
Vous devez simplement ajouter une colonne.
Je reprend un bout de mon code avec la correction:
Public Sub New()
MyBase.New()
MyBase.OwnerDraw = False
MyBase.View = View.Details
MyBase.FullRowSelect = True
MyBase.SmallImageList = MyClass.ImageListExplorer
MyBase.Font = New Font("Verdana", 8)
MyBase.BackColor = Color.White
MyBase.ForeColor = Color.Black
MyBase.HeaderStyle = ColumnHeaderStyle.None
MyBase.Scrollable = True
MyBase.Columns.Add("HiddenColHeader")
End Sub