自定义树视图VB.net

自定义树视图VB.net,vb.net,treeview,Vb.net,Treeview,我想在VB.net中创建一个自定义的treeview控件,我需要做的是有一个标准的treeview控件来显示系统文件结构,例如,但在文件夹/文件名的右侧有一个额外的图标,该图标仅出现在节点的悬停位置上。例如,如果我将鼠标悬停在如图所示的文件夹Sup2上,则会出现橙色图标 我已经做了一些研究,从我所看到的,我必须覆盖onpaint事件来实现这一点,但我不确定具体如何做到这一点。我还需要在新的橙色图标中添加onclick事件 我想下面的例子会给你一些提示和提示 选项显式打开 导入System.Wi

我想在VB.net中创建一个自定义的treeview控件,我需要做的是有一个标准的treeview控件来显示系统文件结构,例如,但在文件夹/文件名的右侧有一个额外的图标,该图标仅出现在节点的悬停位置上。例如,如果我将鼠标悬停在如图所示的文件夹Sup2上,则会出现橙色图标


我已经做了一些研究,从我所看到的,我必须覆盖onpaint事件来实现这一点,但我不确定具体如何做到这一点。我还需要在新的橙色图标中添加onclick事件

我想下面的例子会给你一些提示和提示

选项显式打开
导入System.Windows.Forms
导入系统。绘图
导入System.Drawing.Drawing2D
导入System.Drawing.Text
导入System.Runtime.InteropServices
公共类TreeViewer
继承TreeView
#地区“空气污染指数”
Private Const TVM_SETEXTENDEDSTYLE为整数=&H1100+44
Private Const TVS_EX_DOUBLEBUFFER作为整数=&H4
专用共享函数SendMessage(ByVal hWnd作为IntPtr,
ByVal msg作为整数,
ByVal wp作为IntPtr,
ByVal lp As IntPtr)As IntPtr
端函数
#末端区域
#区域“私人领域”
私有只读RightImage作为位图
作为字符串格式的专用只读NSF
作为TreeNode的专用HoverNode
私有RightImageRect作为矩形
#末端区域
#地区“建设者”
次新
DrawMode=TreeViewDrawMode.OwnerDrawText
RightImage=新位图(My.Resources.Modify)
NSF=新的字符串格式,带有{
.Alignment=StringAlignment.Near,
.LineAlignment=StringAlignment.Center,
.Trimming=StringTrimming.EllipsisCharacter,
.FormatFlags=StringFormatFlags.NoWrap
}
端接头
#末端区域
#区域“油漆”
受保护的覆盖子OnDrawNode(如DrawTreeNodeEventArgs)
MyBase.OnDrawNode(e)
如果e.Node为Nothing,则返回
将矩形变暗为矩形=e。边界:矩形充气(0,1)
如果不是ClientRectangle.则与(rect)相交
返回
如果结束
尺寸G为图形=e.图形
G.SmoothingMode=SmoothingMode.HighQuality
G.TextRenderingHint=TextRenderingHint.ClearTypeGridFit
'选项1:如果要为所选节点绘制不同的背景色。
'如果(如State和TreeNodeStates.Selected)=TreeNodeStates.Selected,则

“使用br作为新的SolidBrush(Color.LightSteelBlue)”这并不专业,但值得一试

我创建了一个类,该类继承自
Treeview
控件并覆盖构造函数-更改默认宽度和高度,将
DrawMode
设置为
TreeViewDrawMode.OwnerDrawText

接下来,我处理了
TreeView.DrawNode
事件,使用
PictureBox
显示图像并根据当前突出显示的项目更改其位置

我还处理了
PictureBox
Click
事件。在该事件下,您可以对突出显示的节点执行任何操作

我将
My.Resources
中的图像用于
ImageList.images(0)
PictureBox.Image

Class Form1
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim trv As New MyTreeView
        trv.Nodes.Add("Suppliers")
        trv.Nodes(0).Nodes.Add("Sup 1")
        trv.Nodes(0).Nodes.Add("Sup 2")
        trv.Nodes(0).Nodes.Add("Sup 3")
        trv.Nodes(0).Nodes.Add("Sup 4")
        trv.Nodes(0).Nodes.Add("Sup 5")
        Controls.Add(trv)
    End Sub
End Class

'Class Starts Here
Public Class MyTreeView
    Inherits TreeView
    WithEvents myImage As PictureBox
    Dim activeItem As TreeNode    'Variable to store active TreeNode
    Public Sub New()
        MyBase.New()              'Call the base class constructor
        'And set some values
        Height = 300
        Width = 300
        Location = New Point(50, 50)
        DrawMode = TreeViewDrawMode.OwnerDrawText       'Very neccesary
        AddHandler DrawNode, AddressOf MyTreeViewDrawNode   
        'Add event handlers
        AddHandler AfterCollapse, AddressOf MyTreeViewCollapsed
        'Set HotTracking event to true to allow for MouseHover
        HotTracking = True
        ImageList = new ImageList
        ImageList.Images.Add(My.Resources.FolderImage)
        ImageIndex = 0

        Font = New Font(Font.FontFamily, 10)
        'Initialize picturebox
        myImage = New PictureBox() With
        {
            .Image = My.Resources.editPencilImage,
            .SizeMode = PictureBoxSizeMode.Zoom,
            .Size = New Size(10, 10),
            .Visible = False
        }
        Controls.Add(myImage)
    End Sub

    Private Sub MyTreeViewCollapsed(sender As Object, e As TreeViewEventArgs)
        myImage.Visible = False
    End Sub

    Sub ImageClicked(sender As Object, e As EventArgs) Handles myImage.Click
        If (Not activeItem Is Nothing) Then
            MessageBox.Show("Clicked Item - " & activeItem.Text)
        End If
    End Sub

    Private Sub MyTreeViewDrawNode(sender As Object, e As DrawTreeNodeEventArgs)
        e.DrawDefault = True
        If (e.State = TreeNodeStates.Hot) Then
            myImage.Visible = True
            activeItem = e.Node
            Dim tmpSize = TextRenderer.MeasureText(e.Node.Text, Font)
            myImage.Location = New Point(e.Node.Bounds.Location.X + tmpSize.Width, e.Node.Bounds.Location.Y)
        End If
    End Sub
End Class

通过将
DrawMode
设置为非
Normal
并处理
DrawNode
事件,可以使用标准的
TreeView
执行此操作。您还可以创建自己的类,在内部执行相同的操作,覆盖
OnDrawNode
,而不是处理事件。