' 1) Gruppe anlegen (nicht unbedingt notwendig) ' 2) Spalte anlegen (beinhaltet den Item-Text) ' 3) Spalte "ItemDescription" anlegen (beinhaltet die Item-Beschreibung) ' 4) Eintrag anlegen (Text des Anzeigenamens) + SubItem (Text der Beschreibung) anlegen ' 5) ImageList (24; 24 px) als LargeImageList hinzufügen (nicht unbedingt notwendig) Imports System.Reflection Imports System.Runtime.InteropServices Imports System.Windows.Forms Imports System.Text Imports System.Drawing.Printing Namespace nUpdate.Administration.UI.Controls _ Public Structure ExplorerTreeNode Public Mask As Integer Public HItem As IntPtr Public State As Integer Public StateMask As Integer Public ReadOnly PszText As IntPtr Public ReadOnly CchTextMax As IntPtr Public ReadOnly Image As Integer Public ReadOnly SelectedImage As Integer Public ReadOnly CChildren As Integer Public ReadOnly LParam As Integer End Structure _ Public Structure ExplorerListViewGroup Public CbSize As Integer Public Mask As ExplorerListViewGroupMask _ Public PszHeader As String Public CchHeader As Integer _ Public PszFooter As String Public CchFooter As Integer Public GroupId As Integer Public StateMask As Integer Public State As ExplorerListViewGroupState Public UAlign As UInteger Private PszSubtitle As IntPtr Public CchSubtitle As UInteger _ Public PszTask As String Public CchTask As UInteger _ Public PszDescriptionTop As String Public CchDescriptionTop As UInteger _ Public PszDescriptionBottom As String Public CchDescriptionBottom As UInteger Public TitleImage As Integer Public ExtendedImage As Integer Public FirstItem As Integer Private ReadOnly CItems As IntPtr Private ReadOnly PszSubsetTitle As IntPtr Private ReadOnly CchSubsetTitle As IntPtr End Structure Public Enum ExplorerListViewGroupMask None = &H0 Header = &H1 Footer = &H2 State = &H4 Align = &H8 GroupId = &H10 SubTitle = &H100 Task = &H200 DescriptionTop = &H400 DescriptionBottom = &H800 TitleImage = &H1000 ExtendedImage = &H2000 Items = &H4000 Subset = &H8000 SubsetItems = &H10000 End Enum Public Enum ExplorerListViewGroupState Normal = 0 Collapsed = 1 Hidden = 2 NoHeader = 4 Collapsible = 8 Focused = 16 Selected = 32 SubSeted = 64 SubSetLinkFocused = 128 End Enum Public Class ExplorerListView Inherits ListView Private Const LVM_FIRST As Integer = &H1000 Private Const LVM_SETEXTENDEDLISTVIEWSTYLE As Integer = LVM_FIRST + 54 Private Const LVS_EX_DOUBLEBUFFER As Integer = &H10000 Private Const WM_LBUTTONUP As Integer = &H202 Private Const LVM_SETGROUPINFO As Integer = (LVM_FIRST + 147) Private _isExplorerListView As Boolean Public Sub New() SetStyle(ControlStyles.OptimizedDoubleBuffer Or ControlStyles.AllPaintingInWmPaint, True) UpdateStyles() FullRowSelect = True View = Windows.Forms.View.Tile MultiSelect = False HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.None BorderStyle = System.Windows.Forms.BorderStyle.None End Sub Public Sub MakeCollapsable() ' Adds expanders to the groups, should be called in form's Show-event If Environment.OSVersion.Version.Major < 6 Then Return End If For Each group As ListViewGroup In Groups Dim placeHolderGroup = New ExplorerListViewGroup() placeHolderGroup.CbSize = Marshal.SizeOf(placeHolderGroup) placeHolderGroup.State = ExplorerListViewGroupState.Collapsible placeHolderGroup.Mask = ExplorerListViewGroupMask.State placeHolderGroup.GroupId = GetGroupId(group) If placeHolderGroup.GroupId >= 0 Then NativeMethods.SendMessage(Handle, LVM_SETGROUPINFO, New IntPtr(placeHolderGroup.GroupId), placeHolderGroup) End If Next End Sub Private Shared Function GetGroupId(group As ListViewGroup) As Integer Dim groupType = group.[GetType]() If True Then Dim groupIdProperty = groupType.GetProperty("ID", BindingFlags.NonPublic Or BindingFlags.Instance) ' Include inner fields and instance members If groupIdProperty Is Nothing Then Return -1 End If Dim value = groupIdProperty.GetValue(group, Nothing) If value IsNot Nothing Then Return CInt(value) End If End If Return -1 End Function Protected Overrides Sub WndProc(ByRef m As Message) If m.Msg = WM_LBUTTONUP AndAlso Environment.OSVersion.Version.Major >= 6 Then DefWndProc(m) End If Select Case m.Msg Case 15 If Not _isExplorerListView Then NativeMethods.SetWindowTheme(Handle, "explorer", Nothing) NativeMethods.SendMessage(Handle, LVM_SETEXTENDEDLISTVIEWSTYLE, New IntPtr(LVS_EX_DOUBLEBUFFER), New IntPtr(LVS_EX_DOUBLEBUFFER)) _isExplorerListView = True End If Exit Select End Select MyBase.WndProc(m) End Sub End Class Friend NotInheritable Class NativeMethods _ Public Enum ShGetFileInfoFlags AddOverlays = &H20 AttributesSpecified = &H20000 Attributes = &H800 DisplayName = &H200 ExeType = &H2000 Icon = &H100 IconLocation = &H1000 LargeIcon = &H0 LinkOverlay = &H8000 OpenIcon = &H2 OverlayIndex = &H40 PathIsItemList = &H8 Selected = &H10000 ShellIconSize = &H4 SmallIcon = &H1 SysIconIndex = &H4000 TypeName = &H400 UseFileAttributes = &H10 End Enum _ Public Shared Function SHGetFileInfo(pszPath As String, dwFileAttributes As Integer, ByRef psfi As Shfileinfo, cbFileInfo As Integer, flags As ShGetFileInfoFlags) As IntPtr End Function _ Public Shared Function DestroyIcon(hIcon As IntPtr) As Boolean End Function _ Public Shared Function SendMessage(hWnd As HandleRef, msg As UInt32, ByRef wParam As Integer, lParam As StringBuilder) As IntPtr End Function _ Public Shared Function SendMessage(hWnd As HandleRef, msg As UInt32, wParam As IntPtr, lParam As String) As IntPtr End Function _ Public Shared Function SendMessage(hWnd As HandleRef, msg As UInt32, wParam As IntPtr, lParam As IntPtr) As IntPtr End Function _ Public Shared Function SendMessage(hWnd As HandleRef, msg As UInt32, wParam As IntPtr, lParam As Boolean) As IntPtr End Function ' Not portable (bool) _ Public Shared Function DwmIsCompositionEnabled() As Boolean End Function _ Public Shared Function DwmExtendFrameIntoClientArea(hwnd As IntPtr, ByRef margins As Margins) As Integer End Function _ Public Shared Function SendMessage(hWnd As IntPtr, msg As Integer, wParam As IntPtr, ByRef item As ExplorerTreeNode) As IntPtr End Function _ Public Shared Function SendMessage(hWnd As IntPtr, msg As UInteger, wParam As IntPtr, lParam As IntPtr) As IntPtr End Function _ Public Shared Function SendMessage(hWnd As IntPtr, msg As Integer, wParam As IntPtr, lParam As String) As IntPtr End Function _ Public Shared Function SetWindowTheme(hWnd As IntPtr, pszSubAppName As String, pszSubIdList As String) As Integer End Function _ Public Shared Function BeginPaint(hWnd As IntPtr, ByRef paintStruct As PaintStruct) As IntPtr End Function _ Public Shared Function EndPaint(hWnd As IntPtr, ByRef paintStruct As PaintStruct) As Boolean End Function _ Public Shared Function InternetGetConnectedState(ByRef connDescription As Integer, reservedValue As Integer) As Boolean End Function _ Public Shared Function SendMessage(hWnd As IntPtr, msg As Integer, wParam As IntPtr, ByRef lParam As ExplorerListViewGroup) As IntPtr End Function _ Public Shared Function SendMessage(hWnd As IntPtr, msg As Integer, wParam As IntPtr, lParam As IntPtr) As IntPtr End Function _ Public Shared Function ReleaseCapture() As Boolean End Function _ Public Shared Sub SHChangeNotify(wEventId As UInt32, uFlags As UInt32, dwItem1 As IntPtr, dwItem2 As IntPtr) End Sub _ Public Structure Shfileinfo Public hIcon As IntPtr Public iIcon As Integer Public dwAttributes As UInteger _ Public szDisplayName As String _ Public szTypeName As String End Structure _ Structure PAINTSTRUCT Public hdc As IntPtr Public fErase As Boolean Public rcPaint As RECT Public fRestore As Boolean Public fIncUpdate As Boolean _ Public rgbReserved As Byte() End Structure _ Public Structure RECT Private _Left As Integer, _Top As Integer, _Right As Integer, _Bottom As Integer Public Sub New(ByVal Rectangle As Rectangle) Me.New(Rectangle.Left, Rectangle.Top, Rectangle.Right, Rectangle.Bottom) End Sub Public Sub New(ByVal Left As Integer, ByVal Top As Integer, ByVal Right As Integer, ByVal Bottom As Integer) _Left = Left _Top = Top _Right = Right _Bottom = Bottom End Sub Public Property X As Integer Get Return _Left End Get Set(ByVal value As Integer) _Right = _Right - _Left + value _Left = value End Set End Property Public Property Y As Integer Get Return _Top End Get Set(ByVal value As Integer) _Bottom = _Bottom - _Top + value _Top = value End Set End Property Public Property Left As Integer Get Return _Left End Get Set(ByVal value As Integer) _Left = value End Set End Property Public Property Top As Integer Get Return _Top End Get Set(ByVal value As Integer) _Top = value End Set End Property Public Property Right As Integer Get Return _Right End Get Set(ByVal value As Integer) _Right = value End Set End Property Public Property Bottom As Integer Get Return _Bottom End Get Set(ByVal value As Integer) _Bottom = value End Set End Property Public Property Height() As Integer Get Return _Bottom - _Top End Get Set(ByVal value As Integer) _Bottom = value + _Top End Set End Property Public Property Width() As Integer Get Return _Right - _Left End Get Set(ByVal value As Integer) _Right = value + _Left End Set End Property Public Property Location() As Point Get Return New Point(Left, Top) End Get Set(ByVal value As Point) _Right = _Right - _Left + value.X _Bottom = _Bottom - _Top + value.Y _Left = value.X _Top = value.Y End Set End Property Public Property Size() As Size Get Return New Size(Width, Height) End Get Set(ByVal value As Size) _Right = value.Width + _Left _Bottom = value.Height + _Top End Set End Property Public Shared Widening Operator CType(ByVal Rectangle As RECT) As Rectangle Return New Rectangle(Rectangle.Left, Rectangle.Top, Rectangle.Width, Rectangle.Height) End Operator Public Shared Widening Operator CType(ByVal Rectangle As Rectangle) As RECT Return New RECT(Rectangle.Left, Rectangle.Top, Rectangle.Right, Rectangle.Bottom) End Operator Public Shared Operator =(ByVal Rectangle1 As RECT, ByVal Rectangle2 As RECT) As Boolean Return Rectangle1.Equals(Rectangle2) End Operator Public Shared Operator <>(ByVal Rectangle1 As RECT, ByVal Rectangle2 As RECT) As Boolean Return Not Rectangle1.Equals(Rectangle2) End Operator Public Overrides Function ToString() As String Return "{Left: " & _Left & "; " & "Top: " & _Top & "; Right: " & _Right & "; Bottom: " & _Bottom & "}" End Function Public Overloads Function Equals(ByVal Rectangle As RECT) As Boolean Return Rectangle.Left = _Left AndAlso Rectangle.Top = _Top AndAlso Rectangle.Right = _Right AndAlso Rectangle.Bottom = _Bottom End Function Public Overloads Overrides Function Equals(ByVal [Object] As Object) As Boolean If TypeOf [Object] Is RECT Then Return Equals(DirectCast([Object], RECT)) ElseIf TypeOf [Object] Is Rectangle Then Return Equals(New RECT(DirectCast([Object], Rectangle))) End If Return False End Function End Structure End Class End Namespace