依星源码资源网,依星资源网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

【好消息,好消息,好消息】VIP会员可以发表文章赚积分啦 !
查看: 37|回复: 0

VC++MFC:树形控件

[复制链接] 主动推送

1万

主题

1万

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
15527
发表于 昨天 11:18 | 显示全部楼层 |阅读模式
VC++MFC:树形控件
成员函数函数名称功能
CTreeCtrlDlg(CWnd* pParent = NULL);构造函数
void InitTreeFile();初始化树形控件,如果复制或用其他对象初始化时需要调用
BOOL SetTreeRoot(const CString strPath);设置根目录
void SetUnwantedString(const std::vector vecStr);设置不想显示的子目录
BOOL SetAcceptMsgWnd(const HWND hWnd);设置接收消息的窗口句柄
CString GetPath();获取当前被选中的目录
BOOL SetTreeImageList(CImageList * ImgList, int nImgList);设置当前控件目录图标

InitTreeFile()
该函数是在通过一个对象来初始化另一个对象或把一个对象赋值给另一个对象后需要调用该函数,以初始化控件。
例如:
  1. CSelfUpdateTreeCtrl * pTreeFile;
  2. pTreeFile = new CSelfUpdateTreeCtrl(m_TreeFile); // m_TreeFile是另一个控件
  3. pTreeFile->Create(TVS_EDITLABELS | TVS_HASBUTTONS | WS_CHILD | WS_VISIBLE,
  4.         rect,
  5.         this,
  6.         IDC_TREE_NODE);
  7. pTreeFile->ShowWindow(SW_SHOWNORMAL);
  8. pTreeFile->InitTreeFile(); // 这里调用初始化函数,初始化控件
复制代码
SetTreeRoot(const CString strPath)
设置控件根目录,在想要改变控件的根目录或者在创建对象的时候没有提供根目录的时候调用。返回值为BOOL型,如果返回值是TRUE,则成功。如果返回值是FALSE,则失败。
例如:
  1. CSelfUpdateTreeCtrl treeCtrl;
  2. treeCtrl.SetTreeRoot(_T("E:\"));
复制代码
SetUnwantedString(const std::vector vecStr)
不想有些目录出现,则可通过该函数设置一些要屏蔽的目录。
例如:
  1. std::vector<CString> vecTemp;
  2. vecTemp.push_back(_T("二值图"));
  3. vecTemp.push_back(_T("缺陷大图"));
  4. vecTemp.push_back(_T("实时图"));
  5. vecTemp.push_back(_T("差影图"));
  6. m_TreeFile.SetTreeRoot(m_strGlobalPath);
  7. m_TreeFile.SetUnwantedString(vecTemp); // 设置不想显示文件夹的字符串

复制代码
SetAcceptMsgWnd(const HWND hWnd)
如果需要其他窗口响应控件的焦点变化的消息则需要调用该函数来设置接收消息的窗口。而响应的窗口需要响应相关的消息。其消息为:WM_SELFUPDATETREECTRL_SELCHANGED。返回值为BOOL型,如果返回值是TRUE,则成功。如果返回值是FALSE,则失败。
例如:
  1. std::vector<CString> vecTemp;
  2. vecTemp.push_back(_T("二值图"));
  3. vecTemp.push_back(_T("缺陷大图"));
  4. vecTemp.push_back(_T("实时图"));
  5. vecTemp.push_back(_T("差影图"));
  6. m_TreeFile.SetTreeRoot(m_strGlobalPath);
  7. m_TreeFile.SetUnwantedString(vecTemp);
  8. m_TreeFile.SetAcceptMsgWnd(m_hWnd); // 设置接收消息的窗口

复制代码
GetPath()
该函数是获取当前选中的节点的绝对路径。返回一个CString的,就是路径地址。
例如:
  1. afx_msg LRESULT CBrowseDlg::OnSelfUpdateTreeMsg(WPARAM wParam,LPARAM lParam)
  2. {
  3.     LoadInformation(m_TreeFile.GetPath());
  4.     return 0;
  5. }

复制代码
SetTreeImageList(CImageList * ImgList, int nImgList)
设置控件中节点的图标。返回值为BOOL型,如果返回值是TRUE,则成功。如果返回值是FALSE,则失败。

  1. HICON hIcon = theApp.LoadIcon(IDI_ICON_TREEFILE);
  2. CImageList imgList;
  3. imgList.Create(16, 16, ILC_COLOR32, 3, 3);
  4. for (int i = 0; i < 8; i++)
  5. {
  6.     imgList.Add(hIcon);
  7. }
  8. m_TreeFile.SetTreeImageList(&imgList, LVSIL_NORMAL);

复制代码
使用案例静态案例
声明为类成员变量
  1. // 在头文件中声明为类
  2. CSelfUpdateTreeCtrl m_TreeFile;

复制代码
  1. // 初始化控件
  2. std::vector<CString> vecTemp;
  3. vecTemp.push_back(_T("二值图"));
  4. vecTemp.push_back(_T("缺陷大图"));
  5. vecTemp.push_back(_T("实时图"));
  6. vecTemp.push_back(_T("差影图"));
  7. m_TreeFile.SetTreeRoot(m_strGlobalPath);
  8. m_TreeFile.SetUnwantedString(vecTemp);
  9. m_TreeFile.SetAcceptMsgWnd(m_hWnd);

  10. HICON hIcon = theApp.LoadIcon(IDI_ICON_TREEFILE);
  11. CImageList imgList;
  12. imgList.Create(16, 16, ILC_COLOR32, 3, 3);
  13. for (int i = 0; i < 8; i++)
  14. {
  15.     imgList.Add(hIcon);
  16. }
  17. m_TreeFile.SetTreeImageList(&imgList, LVSIL_NORMAL);

复制代码
动态案例
  1. CRect rect(300,0, 500,300);
  2. m_pTreeFile = new CSelfUpdateTreeCtrl(m_TreeFile); // 动态创建树形控件

  3. m_pTreeFile->Create(TVS_EDITLABELS | TVS_HASBUTTONS | WS_CHILD | WS_VISIBLE,
  4.     rect,
  5.     this,
  6.     IDC_TREE_NODE);
  7. m_pTreeFile->ShowWindow(SW_SHOWNORMAL);
  8. m_pTreeFile->InitTreeFile();

复制代码
源代码
  1. // 头文件
  2. #pragma once
  3. #include <vector>
  4. // Tree结构

  5. #define WM_SELFUPDATETREECTRL_SELCHANGED WM_USER + 779
  6. // CSelfUpdateTreeCtrl

  7. class CSelfUpdateTreeCtrl : public CTreeCtrl
  8. {
  9.         DECLARE_DYNAMIC(CSelfUpdateTreeCtrl)

  10. public:
  11.         CSelfUpdateTreeCtrl();
  12.         CSelfUpdateTreeCtrl(CString strPath);
  13.         virtual ~CSelfUpdateTreeCtrl();
  14.     CSelfUpdateTreeCtrl(CSelfUpdateTreeCtrl & ob);
  15.     CSelfUpdateTreeCtrl & operator= (CSelfUpdateTreeCtrl & ob);
  16. protected:
  17.         DECLARE_MESSAGE_MAP()

  18. private:
  19.         CString m_strRoot;                            // 根目录
  20.     HWND m_hAcceptMessage;                        // 接收消息的窗口
  21.         std::vector<HTREEITEM> m_vecTreeTop;          // 目录节点树,每一个元素代表一个顶级目录
  22.     std::vector<HTREEITEM> m_vecHierarchy;        // 目录节点用于遍历顶级目录下的子目录
  23.     std::vector<CString> m_vecUnwantedString;     // 不想出现在树形结构上的目录名称列表
  24.     CImageList m_ImgList;                      // 目录树图标列表
  25.     int m_nImgList;
  26.     // 初始化根目录
  27.         BOOL InitRootDirectory();
  28.     // 更新树节点
  29.     BOOL UpdateTreeNode(const unsigned long nIndex);
  30.     // 判断当前节点级别
  31.     int JudgeFloor();
  32.     // 插入树节点
  33.         BOOL InsertTreeNode(const CString strRoot, const unsigned long nIndex);
  34.     // 递归插入
  35.     BOOL InsertRecursion(const CString strRoot, int nFileNum, const unsigned long nIndex);
  36.     // 拷贝图标列表数据
  37.     BOOL SetTreeImageList(CImageList * ImgList);
  38. public:
  39.     // 初始化树形控件,如果复制或用其他对象初始化时需要调用
  40.     void InitTreeFile();
  41.     // 设置根目录
  42.         BOOL SetTreeRoot(const CString strPath);
  43.     // 设置不想显示的目录
  44.     void SetUnwantedString(const std::vector<CString> vecStr);
  45.     // 设置接收消息的窗口
  46.     BOOL SetAcceptMsgWnd(const HWND hWnd);
  47.     // 获取当前目录
  48.     CString GetPath();
  49.     // 发送消息函数
  50.     afx_msg void OnTvnSelchanged(NMHDR * pNMHDR, LRESULT * pResult);
  51.     // 设置图标列表
  52.     BOOL SetTreeImageList(CImageList * ImgList, int nImgList);
  53. };
复制代码
  1. // 源文件
  2. // SelfUpdateTreeCtrl.cpp : 实现文件
  3. //

  4. #include "stdafx.h"
  5. #include "SelfUpdateTreeCtrl.h"
  6. #include <algorithm>

  7. // CSelfUpdateTreeCtrl

  8. IMPLEMENT_DYNAMIC(CSelfUpdateTreeCtrl, CTreeCtrl)

  9. CSelfUpdateTreeCtrl::CSelfUpdateTreeCtrl()
  10. {
  11.         m_strRoot = "";
  12.     m_hAcceptMessage = NULL;
  13.     m_nImgList = LVSIL_NORMAL;
  14. }

  15. CSelfUpdateTreeCtrl::CSelfUpdateTreeCtrl(CString strPath) : m_strRoot(strPath)
  16. {
  17.     m_hAcceptMessage = NULL;
  18.     m_nImgList = LVSIL_NORMAL;
  19.         InitRootDirectory();
  20. }

  21. CSelfUpdateTreeCtrl::~CSelfUpdateTreeCtrl()
  22. {
  23.    if ( NULL != m_ImgList.GetSafeHandle())
  24.    {
  25.        m_ImgList.DeleteImageList();
  26.        ASSERT(m_ImgList.GetSafeHandle() == NULL);
  27.    }
  28. }

  29. CSelfUpdateTreeCtrl::CSelfUpdateTreeCtrl(CSelfUpdateTreeCtrl & ob)
  30. {
  31.     m_strRoot = ob.m_strRoot;
  32.     m_hAcceptMessage = ob.m_hAcceptMessage;
  33.     if (!m_vecTreeTop.empty())
  34.     {
  35.         m_vecTreeTop.clear();
  36.     }
  37.     if (!m_vecHierarchy.empty())
  38.     {
  39.         m_vecHierarchy.clear();
  40.     }
  41.     if (!m_vecUnwantedString.empty())
  42.     {
  43.         m_vecUnwantedString.clear();
  44.     }
  45.     m_vecTreeTop = ob.m_vecTreeTop;
  46.     m_vecHierarchy = ob.m_vecHierarchy;
  47.     m_vecUnwantedString = ob.m_vecUnwantedString;
  48.     //图标列表
  49.     m_nImgList = ob.m_nImgList;
  50.     SetTreeImageList( &(ob.m_ImgList));
  51. }



  52. CSelfUpdateTreeCtrl & CSelfUpdateTreeCtrl::operator= (CSelfUpdateTreeCtrl & ob)
  53. {
  54.     //CTreeCtrl::operator= (ob);
  55.     if (this == &ob)
  56.         return * this;
  57.     m_strRoot = ob.m_strRoot;
  58.     m_hAcceptMessage = ob.m_hAcceptMessage;
  59.     if (!m_vecTreeTop.empty())
  60.     {
  61.         m_vecTreeTop.clear();
  62.     }
  63.     if (!m_vecHierarchy.empty())
  64.     {
  65.         m_vecHierarchy.clear();
  66.     }
  67.     if (!m_vecUnwantedString.empty())
  68.     {
  69.         m_vecUnwantedString.clear();
  70.     }
  71.     m_vecTreeTop = ob.m_vecTreeTop;
  72.     m_vecHierarchy = ob.m_vecHierarchy;
  73.     m_vecUnwantedString = ob.m_vecUnwantedString;
  74.     // 图标列表
  75.     m_nImgList = ob.m_nImgList;
  76.     if (m_ImgList.GetSafeHandle())
  77.     {
  78.         m_ImgList.DeleteImageList();
  79.         ASSERT(m_ImgList.GetSafeHandle() == NULL);
  80.     }
  81.     SetTreeImageList(&(ob.m_ImgList));

  82.     return *this;
  83. }

  84. BEGIN_MESSAGE_MAP(CSelfUpdateTreeCtrl, CTreeCtrl)
  85.     ON_NOTIFY_REFLECT(TVN_SELCHANGED, &CSelfUpdateTreeCtrl::OnTvnSelchanged)
  86. END_MESSAGE_MAP()



  87. // CSelfUpdateTreeCtrl 消息处理程序
  88. BOOL CSelfUpdateTreeCtrl::SetTreeRoot(CString strPath)
  89. {
  90.         m_strRoot = strPath;
  91.         return InitRootDirectory();
  92. }

  93. BOOL CSelfUpdateTreeCtrl::InitRootDirectory()
  94. {
  95.     if ("" == m_strRoot)
  96.     {
  97.         return FALSE;
  98.     }
  99.     if (!m_vecTreeTop.empty())
  100.     {
  101.         m_vecTreeTop.clear();
  102.     }
  103.     CFileFind file;
  104.     CString strDirectory = m_strRoot;
  105.     if ( strDirectory.Right(1) != "\" )
  106.     {
  107.         strDirectory += _T("\");
  108.     }
  109.     strDirectory += _T("*.*");
  110.     BOOL bRet = file.FindFile(strDirectory);
  111.     unsigned long ulNum = 0;// 给每个结点设置索引号
  112.     while(bRet)
  113.     {
  114.         bRet = file.FindNextFile();  // 是否有下一个目录
  115.         if (file.IsDirectory() && !file.IsDots())
  116.         {
  117.             CString strPath = file.GetFilePath();
  118.             CString strTitle = strPath.Right(strPath.GetLength()-strPath.ReverseFind('\\')-1);
  119.             HTREEITEM hItem = InsertItem(strTitle, 0, 0, NULL);
  120.             m_vecTreeTop.push_back(hItem);
  121.             SetItemData(hItem, ulNum);
  122.             ulNum++;
  123.         }
  124.     }
  125.     file.Close();
  126.     return TRUE;
  127. }

  128. void CSelfUpdateTreeCtrl::OnTvnSelchanged(NMHDR *pNMHDR, LRESULT *pResult)
  129. {
  130.     LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);
  131.     // TODO: 在此添加控件通知处理程序代码
  132.     // 获取当前选中节点深度
  133.     int nFloor = JudgeFloor();
  134.     // 更新当前目录
  135.     if ( 0 == nFloor && !ItemHasChildren(GetSelectedItem()))
  136.     {
  137.         unsigned long ulNum = GetItemData(GetSelectedItem());
  138.         UpdateTreeNode(ulNum);
  139.     }
  140.     else
  141.     {
  142.         if (m_hAcceptMessage)
  143.         {
  144.             ::PostMessage(m_hAcceptMessage, WM_SELFUPDATETREECTRL_SELCHANGED, 0, 0);
  145.         }
  146.     }
  147.     *pResult = 0;
  148. }

  149. int CSelfUpdateTreeCtrl::JudgeFloor()
  150. {
  151.      int nDepth = 0;
  152.      HTREEITEM hCurrentNode = GetSelectedItem();
  153.      while ( (hCurrentNode = GetParentItem(hCurrentNode)) != NULL)
  154.      {
  155.          nDepth++;
  156.      }
  157.      return nDepth;
  158. }

  159. BOOL CSelfUpdateTreeCtrl::UpdateTreeNode(unsigned long nIndex)
  160. {
  161.     // 调用插入节点函数
  162.     return InsertTreeNode(GetPath(), nIndex);
  163. }

  164. BOOL CSelfUpdateTreeCtrl::InsertTreeNode(CString strRoot, unsigned long nIndex)
  165. {

  166.     if ( "" == strRoot || nIndex >= m_vecTreeTop.size())
  167.     {
  168.         return FALSE;
  169.     }
  170.     BOOL bRet = InsertRecursion(strRoot, 0, nIndex);
  171.     m_vecHierarchy.clear();
  172.     return bRet;
  173. }

  174. BOOL CSelfUpdateTreeCtrl::InsertRecursion(CString strRoot, int nFileNum, unsigned long nIndex)
  175. {
  176.     nFileNum++;//这个一定要放在switch之前,不能放在下面
  177.     CFileFind file;
  178.     CString strDirectory = strRoot;
  179.     if ( strDirectory.Right(1) != "\" )
  180.     {
  181.         strDirectory += _T("\");
  182.     }
  183.     strDirectory += _T("*.*");
  184.     BOOL bRet = file.FindFile(strDirectory);
  185.     while(bRet)
  186.     {
  187.         bRet = file.FindNextFile();  // 是否有下一个目录
  188.         if (file.IsDirectory() && !file.IsDots())
  189.         {
  190.             CString strPath = file.GetFilePath();
  191.             CString strTitle = strPath.Right(strPath.GetLength()-strPath.ReverseFind('\\')-1);
  192.             if(std::find(m_vecUnwantedString.begin(), m_vecUnwantedString.end(), strTitle) != m_vecUnwantedString.end())
  193.             {
  194.                 continue;
  195.             }
  196.             switch( nFileNum )
  197.             {
  198.             case 1:
  199.                 if (m_vecHierarchy.empty())
  200.                 {
  201.                      m_vecHierarchy.push_back(InsertItem(strTitle, nFileNum, nFileNum, m_vecTreeTop[nIndex]));
  202.                 }
  203.                 else
  204.                 {
  205.                     m_vecHierarchy[nFileNum - 1] = InsertItem(strTitle, nFileNum, nFileNum,m_vecTreeTop[nIndex]);
  206.                 }
  207.                 break;
  208.             default:
  209.                 if ( m_vecHierarchy.size() <= nFileNum - 1 )
  210.                 {
  211.                     m_vecHierarchy.push_back(InsertItem(strTitle, nFileNum, nFileNum,m_vecHierarchy[nFileNum - 2]));
  212.                 }
  213.                 else
  214.                 {
  215.                     m_vecHierarchy[nFileNum - 1] = InsertItem(strTitle, nFileNum, nFileNum,m_vecHierarchy[nFileNum - 2]);
  216.                 }
  217.                 break;
  218.             }
  219.             InsertRecursion(strPath, nFileNum, nIndex);//递归遍历子目录
  220.         }
  221.         else if( !file.IsDirectory() && !file.IsDots() )//如果不是一个目录,并且也不是当前目录
  222.         {
  223.             ;//暂时不处理其他类型的图片
  224.         }
  225.     }//是否找到文件
  226.     file.Close();
  227.     return TRUE;
  228. }

  229. void CSelfUpdateTreeCtrl::SetUnwantedString(std::vector<CString> vecStr)
  230. {
  231.     m_vecUnwantedString = vecStr;
  232. }

  233. BOOL CSelfUpdateTreeCtrl::SetAcceptMsgWnd(HWND hWnd)
  234. {
  235.      if (hWnd)
  236.      {
  237.          m_hAcceptMessage = hWnd;
  238.          return TRUE;
  239.      }
  240.      else
  241.      {
  242.          return FALSE;
  243.      }
  244. }

  245. CString CSelfUpdateTreeCtrl::GetPath()
  246. {
  247.     HTREEITEM CurrentNode = GetSelectedItem();
  248.     HTREEITEM ParentNode = GetParentItem(CurrentNode);
  249.     CString strPath = GetItemText(ParentNode);
  250.     CString strSelf = GetItemText(CurrentNode);
  251.     if ("" == strPath)
  252.     {
  253.         strPath += strSelf+_T("\");
  254.     }
  255.     else
  256.     {
  257.         strPath += _T("\") + strSelf+_T("\");
  258.     }
  259.     while((ParentNode = GetParentItem(ParentNode))!=NULL)
  260.     {
  261.         CString strTemp = GetItemText(ParentNode);
  262.         strPath = strTemp + _T("\") + strPath;
  263.     }
  264.     strPath = m_strRoot + _T("\") + strPath;
  265.     return strPath;
  266. }

  267. BOOL CSelfUpdateTreeCtrl::SetTreeImageList(CImageList * ImgList, int nImgList)
  268. {
  269.     if ((NULL == ImgList->GetSafeHandle()) || (ImgList == &m_ImgList))
  270.     {
  271.         return FALSE;
  272.     }
  273.     if ( m_ImgList.GetSafeHandle() )
  274.     {
  275.         m_ImgList.DeleteImageList();
  276.         ASSERT( m_ImgList.GetSafeHandle() == NULL);
  277.     }
  278.     m_ImgList.Create(ImgList);
  279.     m_nImgList = nImgList;
  280.     SetImageList(&m_ImgList, m_nImgList);
  281.     return TRUE;
  282. }

  283. BOOL CSelfUpdateTreeCtrl::SetTreeImageList(CImageList * ImgList)
  284. {
  285.     if ((NULL == ImgList->GetSafeHandle()) || (ImgList == &m_ImgList))
  286.     {
  287.         return FALSE;
  288.     }
  289.     if ( m_ImgList.GetSafeHandle() )
  290.     {
  291.         m_ImgList.DeleteImageList();
  292.         ASSERT( m_ImgList.GetSafeHandle() == NULL);
  293.     }
  294.     m_ImgList.Create(ImgList);
  295.     return TRUE;
  296. }

  297. void CSelfUpdateTreeCtrl::InitTreeFile()
  298. {
  299.      if (!m_vecTreeTop.empty())
  300.      {
  301.          m_vecTreeTop.clear();
  302.          DeleteAllItems();
  303.      }
  304.      SetImageList(&m_ImgList, m_nImgList);
  305.      InitRootDirectory();
  306. }

复制代码
附言
该类继承自类CTreeCtrl,重载了“=”操作符和拷贝构造函数,可以直接把一个对象赋值给另一个对象,或者用一个对象初始化另一个对象。但是之后需要调用InitTreeFile()函数。
这里是采用了缓加载目录的方法,当初始化后会只加载顶级目录,子目录是没有加载的。这样可以避免当目录过多的时候导致加载时间过长的现象。子目录是当焦点转移到顶级目录的时候才加载相关目录下面的子目录。
如下图:

VC++MFC:树形控件

VC++MFC:树形控件

相关帖子

扫码关注微信公众号,及时获取最新资源信息!下载附件优惠VIP会员6折;永久VIP4折
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

免责声明:
1、本站提供的所有资源仅供参考学习使用,版权归原著所有,禁止下载本站资源参与商业和非法行为,请在24小时之内自行删除!
2、本站所有内容均由互联网收集整理、网友上传,并且以计算机技术研究交流为目的,仅供大家参考、学习,请勿任何商业目的与商业用途。
3、若您需要商业运营或用于其他商业活动,请您购买正版授权并合法使用。
4、论坛的所有内容都不保证其准确性,完整性,有效性,由于源码具有复制性,一经售出,概不退换。阅读本站内容因误导等因素而造成的损失本站不承担连带责任。
5、用户使用本网站必须遵守适用的法律法规,对于用户违法使用本站非法运营而引起的一切责任,由用户自行承担
6、本站所有资源来自互联网转载,版权归原著所有,用户访问和使用本站的条件是必须接受本站“免责声明”,如果不遵守,请勿访问或使用本网站
7、本站使用者因为违反本声明的规定而触犯中华人民共和国法律的,一切后果自己负责,本站不承担任何责任。
8、凡以任何方式登陆本网站或直接、间接使用本网站资料者,视为自愿接受本网站声明的约束。
9、本站以《2013 中华人民共和国计算机软件保护条例》第二章 “软件著作权” 第十七条为原则:为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬。若有学员需要商用本站资源,请务必联系版权方购买正版授权!
10、本网站如无意中侵犯了某个企业或个人的知识产权,请来信【站长信箱312337667@qq.com】告之,本站将立即删除。
郑重声明:
本站所有资源仅供用户本地电脑学习源代码的内含设计思想和原理,禁止任何其他用途!
本站所有资源、教程来自互联网转载,仅供学习交流,不得商业运营资源,不确保资源完整性,图片和资源仅供参考,不提供任何技术服务。
本站资源仅供本地编辑研究学习参考,禁止未经资源商正版授权参与任何商业行为,违法行为!如需商业请购买各资源商正版授权
本站仅收集资源,提供用户自学研究使用,本站不存在私自接受协助用户架设游戏或资源,非法运营资源行为。
 
在线客服
点击这里给我发消息 点击这里给我发消息 点击这里给我发消息
售前咨询热线
312337667

微信扫一扫,私享最新原创实用干货

QQ|免责声明|小黑屋|依星资源网 ( 鲁ICP备2021043233号-3 )|网站地图

GMT+8, 2025-4-16 21:53

Powered by Net188.com X3.4

邮箱:312337667@qq.com 客服QQ:312337667(工作时间:9:00~21:00)

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