转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 软件使用 >> 系统软件 >> 正文
仿Explorer的目录树视图类         

仿Explorer的目录树视图类

作者:闵涛 文章来源:闵涛的学习笔记 点击数:4132 更新时间:2009/4/25 0:44:57
CP,MB_PRECOMPOSED, lpszPath, -1,
     szOleStr, sizeof(szOleStr));
 // 转换路径
 pDesktop->ParseDisplayName(NULL, NULL, szOleStr, NULL, &lpidl, NULL);

 // 释放接口
 pDesktop->Release();

 return lpidl;
}

// PIDL中的下一个结构
inline LPITEMIDLIST PIDL_Next(LPITEMIDLIST p)
{
 return (LPITEMIDLIST)((DWORD)p + p->mkid.cb);
}

// 求指定的PIDL的长度,不包括结尾的两个字节的0
inline int PIDL_Len(LPITEMIDLIST p)
{
 WORD  wLen = 0;
 // 累加所有的单元结构尺寸
 while(p && p->mkid.cb != 0)
 {
  wLen += p->mkid.cb;
  p = PIDL_Next(p);
 }
 return wLen;
}


// 设置当前目录
BOOL CShellFolderView::SetCurPath(LPCTSTR lpszPath)
{
 // 解释路径为PIDL
 LPITEMIDLIST lpidl = PathToIDList(lpszPath);
 if(lpidl == NULL) return FALSE;

 CTreeCtrl&  tree = GetTreeCtrl();
 // 从桌面结点开始搜索
 HTREEITEM  hDesktop = tree.GetRootItem();
 if(hDesktop == NULL){
  m_pMalloc->Free(lpidl);
  return FALSE;
 }

 HTREEITEM  hCur = hDesktop;
 WORD wPart = 0;
 LPITEMIDLIST  lpidlPart = lpidl;
 // 对于每一个存在的结点,搜索其下的子结点
 while(hCur != NULL && lpidlPart->mkid.cb != 0)
 {
  // 展开该结点
  Expand(hCur,TVE_EXPAND);
  wPart += lpidlPart->mkid.cb;
  HTREEITEM hChild = tree.GetChildItem(hCur);
  // 如果子结点存在,则:
  while (hChild != NULL)
  {
   // 取得结点数据
   LPFOLDERNODE lpfn = (LPFOLDERNODE)tree.GetItemData(hChild);
   // 如果PIDL的长度匹配的话,则比较这两个PIDL
   // PIDL的匹配长度按搜索深度层次而增加,即,第一次搜索匹配一个结构的长度,第二次
   // 则匹配两个结构的长...
   if(lpfn && PIDL_Len(lpfn->pidl) == wPart)
   {
    if(memcmp(lpidl, lpfn->pidl, wPart) == 0)
    {
     // 匹配成功
     break;
    }
   }
   hChild = tree.GetNextSiblingItem(hChild); // 下一个结点
  }
  hCur = hChild;
  lpidlPart = PIDL_Next(lpidlPart); // PIDL的下一个结构
 }
 // 如果子结点存在,则匹配成功. 选中该结点
 if(hCur != NULL)
 {
  tree.SelectItem(hCur);
  tree.EnsureVisible(hCur);
 }

 m_pMalloc->Free(lpidl);

 return hCur != NULL;
}

// 释放结点数据
void CShellFolderView::FreeNodeData(LPFOLDERNODE lpfn)
{
 if(lpfn)
 {
  m_pMalloc->Free(lpfn->pidl);  // 释放PIDL
  if(lpfn->pShellFolder)        // 释放IShellFolder接口
   lpfn->pShellFolder->Release();
  if(lpfn->pMonitorThread != NULL) // 删除监视线程
   delete lpfn->pMonitorThread;
  delete  lpfn;                 // 删除该结点
 }
}

void CShellFolderView::FreeNode(HTREEITEM hNode)
{
 CTreeCtrl& tree = GetTreeCtrl();
 if(hNode == NULL)
 {
  // 空的参数指明,将删除所有结点的数据
  hNode = tree.GetRootItem();
 }
 else
 {
  // 删除本结点数据
  LPFOLDERNODE lpfn = (LPFOLDERNODE)tree.GetItemData(hNode);
  FreeNodeData(lpfn);
  // 结点指向子结点
  hNode = tree.GetChildItem(hNode);
 }
 // 删除所有子结点的数据
 while(hNode != NULL)
 {
  FreeNode(hNode);
  hNode = tree.GetNextSiblingItem(hNode);
 }
}

// 返回当前选中的路径(没有则返回空串)
CString CShellFolderView::GetSelectedDir()
{
 HTREEITEM hSel = GetTreeCtrl().GetSelectedItem();
 if(hSel == NULL) return "";
 return ((LPFOLDERNODE)GetTreeCtrl().GetItemData(hSel))->cPath;
}

上一页  [1] [2] [3] [4] [5] [6] 


[办公软件]在sybase中插入图片、PDF、文本文件  [办公软件]安装Sybase ASE
[办公软件]linux指令大全(完整篇)  [办公软件]Linux新手入门常用命令大全
[办公软件]在RedHat Linux 9里安装gaim0.80  [办公软件]浅谈Linux 下Java 1.5 汉字方块问题解决方法
[办公软件]Linux程序员必读:中文化与GB18030标准  [办公软件]linux指令大全
[办公软件]制作Linux启动盘的四种方法  [办公软件]Linux文件系统的反删除方法
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · 办公软件  · 系统软件
    · 常用软件  · 聊天工具
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台