VisualFreeBasic控件_YFTreeView 目录树

2026-1-21 / 0 评论 / 41 阅读

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

使用方法,添加数据

   Dim aa As YFTreeViewData Ptr = YFTreeView1.AddItem(0, "文字1")
   aa = YFTreeView1.AddItem(0, "文字2")
   '需要添加子项目
   Dim bb As YFTreeViewData Ptr =YFTreeView1.AddItem(aa, "子文字1")

支持图标

  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 )
  1. 字体图标
    先要在起始代码区加载字体
字体文件在资源中
   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 )
  1. 图标文件
   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里的 工具菜单里,就可以找到这个软件。

评论一下?

OωO
取消