和系统标准控件使用方法类似,主要不同的是图标使用字体图标

使用方法,添加数据
Dim aa As YFTreeViewData Ptr = YFTreeView1.AddItem(0, "文字1")
aa = YFTreeView1.AddItem(0, "文字2")
'需要添加子项目
Dim bb As YFTreeViewData Ptr =YFTreeView1.AddItem(aa, "子文字1")
支持图标
- 矢量图标
添加矢量图标
Redim YFTreeView1.vico(2)
YFTreeView1.vico(1)="f00101UU.7UL[YZL`Y^B`UcP[_]iVVZ[VlUL[Y+c200Z^YnV_V_" '矢量图标字符串
YFTreeView1.vico(2)="a.42TP.7[sWraiWrai^F+a*6WKZPWK`n]C`n+b01TP00?T_T_Z[YF+b*6\t^QZ[YD" '矢量图标字符串
添加数据,带矢量图标索引
YFTreeView1.AddItem(0,"行文字1",0,1 )
YFTreeView1.AddItem(0,"行文字2",0,2 )
- 字体图标
先要在起始代码区加载字体
字体文件在资源中
Dim ss As String = GetResourceStr("FONT_ICONFONT")
Dim As Long uu
Dim ff As Any Ptr = AddFontMemResourceEx(StrPtr(ss), Len(ss), 0, @uu)
字体文件是一个文件
Dim sst As String = App.Path & "iconfont.ttf"
Dim As Long uu = AddFontResourceExA(StrPtr(sst) ,FR_PRIVATE ,0)
添加数据,带字体中的字符值
YFTreeView1.AddItem(0,"行文字1",0,&HE655)
YFTreeView1.AddItem(0,"行文字2",0,&HE651 )
- 图标文件
Dim H As HICON = LoadIcon(NULL, IDI_ERROR) ‘加载图标,不可以立即释放,等控件不显示了,必须释放
YFTreeView1.AddItem(0,"行文字2", 0,Cast(Integer, H))
新增的全部参数
Dim aa As YFTreeViewData Ptr = YFTreeView1.AddItem(0, "文字1",用户数据,普通字体图标,展开字体图标,是否为目录,图标颜色,文字颜色,背景颜色,是否选中)
普通字体图标,展开字体图标 当目录时,展开和没展开可以设置不同的图标
是否为目录 当没有子项目时,也显示为有子项目的状态
是否选中 当控件有带复选框样式,那么选中就会显示打勾
自绘
在事件中,自己可以画
Function Form1_YFTreeView1_OwnerDraw(hWndForm As hWnd,hWndControl As hWnd,gg As yGDI , hItem As YFTreeViewData ,x As Long ,y As Long ,w As Long ,h As Long,Sel As Long ,kMouse As Long,kPress As Long,ByRef maxW As Long) As LResult
gg.SetColor &H0000FF 'GDI的颜色值。RGB=255,0,0
nl.ShowWidth = gg.GetTextWidth(nL.sText) + x
If maxW<nl.ShowWidth Then maxW=nl.ShowWidth '必须设置,控件才能判断出要不要显示水平滚动条。不需要水平滚动,可以不设置
gg.DrawTextS(x ,y ,w ,h ,nL.sText ,DT_VCENTER Or DT_SINGLELINE Or DT_NOPREFIX Or DT_WORD_ELLIPSIS)
Return True
Function = False ' 自己画了后需要应返回 TRUE 控件就不画了,不然控件会再画。
End Function
列遍目录树所有数据
'列遍目录树所有数据 -----------深度算法,从上到下,先查子再进入
Dim 当前项目 As YFTreeViewData Ptr
Dim 下一个项目 As YFTreeViewData Ptr
下一个项目 = YFTreeView1.GetRoot '根
当前项目 = YFTreeView1.GetChild(下一个项目) '第一个项目
Do
If 当前项目 = 0 Then Exit Do '无项目
'项目处理 -----------
Print 当前项目->DataValue, 当前项目->sText '这里是你自己写的处理代码
'继续列出下一个 -------------
下一个项目 = YFTreeView1.GetChild(当前项目) '查找第一个子项目
If 下一个项目 Then
当前项目 = 下一个项目
Else
下一个项目 = YFTreeView1.GetNextSiblin(当前项目) '没有子项目,就查找下一个项目
If 下一个项目 Then
当前项目 = 下一个项目
Else
'没有任何项目了,就返回到父项目
Do
下一个项目 = YFTreeView1.GetParent(当前项目)
If 下一个项目 = 0 OrElse 下一个项目 = YFTreeView1.GetRoot Then Exit Do, Do '已经到顶了,无项目处理,退出
当前项目 = YFTreeView1.GetNextSiblin(下一个项目)
If 当前项目 Then Exit Do '有项目
当前项目 = 下一个项目 '已经到底,再向上一级别
Loop
End If
End If
Loop
动态加载数据
比方要显示一个教程,教程中有很多目录,可能目录非常多,几千几万的,你要一次加载就非常缓慢。我们可以动态加载来实现,速度非常快,又能正常显示所有目录。
方法:
- 只加载根目录,有子项目的在添加时,“是否为目录”参数设置为 1
- 在“某结点将被展开”事件中,加载此子项目。
Function Form1_YFTreeView1_ItemExpanding(hWndForm As hWnd, hWndControl As hWnd,hItem As YFTreeViewData Ptr,action As Long )As LResult
Function = False 'TRUE 可防止列表扩展或折叠。
End Function
例:新增项目时,在“用户数据”中赋值 数据库ID,那么在展开事件中,可以根据ID来加载数据了。
图标制作
使用 VisualFreeBasic 自带的 【矢量图标编辑器】 编辑一个,里面自带了很多图标,可以复制过来即可,在 VFB里的 工具菜单里,就可以找到这个软件。
评论一下?