SOUI官方论坛

 找回密码
 立即注册
查看: 1469|回复: 5

【新手入门】【控件】STreeview篇

[复制链接]

该用户从未签到

39

主题

93

帖子

462

积分

02:00元婴期

Rank: 3Rank: 3

积分
462
发表于 2019-11-27 09:32:38 | 显示全部楼层 |阅读模式
项目开发用到了STreeview这个控件,不是特别明白,现在先占个位子。
  1. class CAdapterLocalFile :public STreeAdapterBase<LocalFileInfo>      // 类 - 目录树适配器
  2. {
  3. public:
  4.         void addTree(SStringT& strCurDir, HSTREEITEM root = STVI_ROOT, int deep = 10);  // 子方法 - 增加目录树 最多伸展10次
  5.         bool onSwitchClick(EventArgs *pEvt);                             // 事件   - 收缩 伸展 目录树

  6.         SOUI::HTREEITEM FindItem(const SStringT & path,SOUI::HTREEITEM hRoot=STVI_ROOT) const;
  7.         void clear();
  8. protected:

  9.         virtual void getView(SOUI::HTREEITEM loc, SWindow * pItem, pugi::xml_node xmlTemplate); // 重载 - 获取视图
  10. };
复制代码
  1. #include "stdafx.h"
  2. #include "pageLocalGallery.h"

  3. void CAdapterLocalFile::addTree(SStringT& strCurDir, HSTREEITEM root /* = STVI_ROOT */, int deep /* = 5*/)
  4. {
  5.         SStringT strDir = strCurDir,strNextDir;
  6.         strDir.Append(_T("\\*"));
  7.         if(deep-- <= 0) return; // 搜索深度

  8.         LocalFileInfo fi;
  9.         WIN32_FIND_DATA fd;
  10.         HANDLE hDir = ::FindFirstFile(strDir.GetBuffer(0), &fd);
  11.         if (hDir == INVALID_HANDLE_VALUE) return ;
  12.         if(root == STVI_ROOT){
  13.                 TCHAR* name = _tcsrchr(strCurDir.GetBuffer(0),_T('\\'));
  14.                 lstrcpy(fi.path, strCurDir.GetBuffer(0));
  15.                 lstrcpy(fi.name, name + 1);
  16.                 root = InsertItem(fi);
  17.         }
  18.         do{
  19.                 strNextDir = strCurDir;
  20.                 strNextDir.Append(_T("\"));
  21.                 if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY){
  22.                         SStringT strFileName = fd.cFileName;
  23.                         if (strFileName.Compare(_T(".")) == 0 || strFileName.Compare(_T("..")) == 0)
  24.                                 continue;

  25.                         strNextDir.Append(fd.cFileName);
  26.                         lstrcpy(fi.name, fd.cFileName);
  27.                         lstrcpy(fi.path, strNextDir.GetBuffer(0));

  28.                         HSTREEITEM hRoot = InsertItem(fi, root);
  29.                         this->addTree(strNextDir, hRoot, deep);
  30.                 }
  31.         } while (::FindNextFile(hDir, &fd));
  32.         ::FindClose(hDir);
  33. }

  34. void CAdapterLocalFile::getView(SOUI::HTREEITEM loc, SWindow * pItem, pugi::xml_node xmlTemplate)
  35. {
  36.         if (pItem->GetChildrenCount() == 0)
  37.                 pItem->InitFromXml(xmlTemplate);
  38.        
  39.         ItemInfo & ii = m_tree.GetItemRef((HSTREEITEM)loc);
  40.         pItem->SetUserData((ULONG_PTR)&(ii.data));

  41.         SWindow *text_red = pItem->FindChildByName(uiDirName);
  42.         text_red->SetWindowText(ii.data.name);

  43.         SToggle *pSwitch = pItem->FindChildByName2<SToggle>(uiDirSwitch);
  44.         SASSERT(pSwitch);
  45.         pSwitch->SetVisible(HasChildren(loc));
  46.         pSwitch->SetToggle(IsItemExpanded(loc));
  47.         pSwitch->GetEventSet()->subscribeEvent(EVT_CMD, Subscriber(&CAdapterLocalFile::onSwitchClick, this));
  48. }

  49. bool CAdapterLocalFile::onSwitchClick(EventArgs *pEvt)
  50. {
  51.         SToggle *pToggle = sobj_cast<SToggle>(pEvt->sender);
  52.         SItemPanel *pItem = sobj_cast<SItemPanel>(pToggle->GetRoot());
  53.         SOUI::HTREEITEM loc = (SOUI::HTREEITEM)pItem->GetItemIndex();
  54.         ExpandItem(loc, ITvAdapter::TVC_TOGGLE);
  55.         return true;
  56. }

  57. SOUI::HTREEITEM CAdapterLocalFile::FindItem(const SStringT & path,SOUI::HTREEITEM hRoot) const
  58. {
  59.         SOUI::HTREEITEM hItem = this->GetFirstChildItem(hRoot);
  60.         while(hItem)
  61.         {
  62.                 const LocalFileInfo & data= GetItemData(hItem);
  63.                 if(_tcscmp(path,data.path) == 0)
  64.                 {
  65.                         break;
  66.                 }
  67.                 if(this->HasChildren(hItem))
  68.                 {
  69.                         SOUI::HTREEITEM hFind = FindItem(path,hItem);
  70.                         if(hFind)
  71.                         {
  72.                                 hItem = hFind;
  73.                                 break;
  74.                         }
  75.                 }
  76.                 hItem = this->GetNextSiblingItem(hItem);
  77.         }
  78.         return hItem;
  79. }

  80. void CAdapterLocalFile::clear()
  81. {
  82.         HSTREEITEM root = this->ITEM_ROOT;
  83.         this->DeleteItem(root);
  84. }
复制代码



  • TA的每日心情
    开心
    前天 22:51
  • 签到天数: 946 天

    [LV.10]以坛为家III

    581

    主题

    1343

    帖子

    2万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    28876
    发表于 2019-12-4 17:22:45 | 显示全部楼层
    谢谢楼主分享

    该用户从未签到

    4

    主题

    67

    帖子

    1388

    积分

    06:00合体期

    Rank: 6Rank: 6

    积分
    1388
    发表于 2019-12-10 19:21:49 | 显示全部楼层
    楼主有试过删除一个节点吗

    该用户从未签到

    39

    主题

    93

    帖子

    462

    积分

    02:00元婴期

    Rank: 3Rank: 3

    积分
    462
     楼主| 发表于 2019-12-17 17:10:29 | 显示全部楼层
    lemon 发表于 2019-12-10 19:21
    楼主有试过删除一个节点吗

    有啥问题吗?

    该用户从未签到

    4

    主题

    67

    帖子

    1388

    积分

    06:00合体期

    Rank: 6Rank: 6

    积分
    1388
    发表于 2019-12-17 19:25:44 | 显示全部楼层

    没有问题啊 不过你可以试试

    该用户从未签到

    0

    主题

    12

    帖子

    223

    积分

    02:00元婴期

    Rank: 3Rank: 3

    积分
    223
    发表于 2020-10-30 01:49:19 | 显示全部楼层
    楼主,有没有改节点data的案例?如果改xml的话,notifyBranchChanged()会有影响,请问有没有别的办法?
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|手机版|小黑屋|SOUI官方论坛

    GMT+8, 2024-5-18 11:56

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表