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

仿Explorer的目录树视图类

作者:闵涛 文章来源:闵涛的学习笔记 点击数:4131 更新时间:2009/4/25 0:44:57
sp;TRACE3("<%s> = \"%s\";  // Normal = %s\n", fpl.cInFolder, fpl.cForParsing, fpl.cNormal);
 }

 // 取得属性
 ULONG  Attributes = SFGAO_SHARE | SFGAO_FILESYSTEM |
      SFGAO_LINK | SFGAO_HASSUBFOLDER;
 if(lpfnParent == NULL ||
  lpfnParent->pShellFolder->GetAttributesOf(
   1, (LPCITEMIDLIST*)&lpidl, &Attributes) != NOERROR)
 {
  Attributes = 0;
  //lpfnParent = NULL;
 }

 // 是否是一个虚拟文件夹
 BOOL bVirFolder = ((Attributes & SFGAO_FILESYSTEM) == 0);

 if(lpfnParent != NULL)
 {
  switch(lpfnParent->fType)
  {
  case ftNetworkNeighborhood:
  case ftNetNode:
   bVirFolder = TRUE;
  }
 }
 if(!bVirtual && bVirFolder)
  return NULL;

 // 生成该文件夹的绝对PIDL,方法就是将相对PIDL附加到父PIDL后
 WORD         wParentPIDLLen = 0;
 LPITEMIDLIST lpidlParent    = NULL;
 if(lpfnParent != NULL)
 {
  wParentPIDLLen = lpfnParent->widlen;
  lpidlParent    = lpfnParent->pidl;
 }

 WORD pidlen = lpidl->mkid.cb;
 // 使用IMalloc接口分配新PIDL需要的空间.因为从系统API返回的PIDL
 // 都是通过IMalloc接口分配的空间,所以为了统一,这里也使用IMalloc来分配空间
 LPITEMIDLIST  lpidlNew = (LPITEMIDLIST)m_pMalloc->Alloc(pidlen + wParentPIDLLen + 2);

 if(wParentPIDLLen != 0)
 {
  memcpy(lpidlNew, lpidlParent, wParentPIDLLen);
  memcpy((char*)lpidlNew+wParentPIDLLen, lpidl,pidlen);
 }
 else
 {
  memcpy(lpidlNew, lpidl, pidlen);
 }

 *(WORD*)((char*)lpidlNew + wParentPIDLLen + pidlen) = 0;

 LPITEMIDLIST lpidlTemp = /*bVirFolder ? lpidl : */lpidlNew;

 // 获取图标索引
 SHFILEINFO  shfi;
 UINT   uIcon, uSelectedIcon;
 ::SHGetFileInfo((LPCTSTR)lpidlTemp, SFGAO_SHARE, &shfi, sizeof(shfi),
    SHGFI_PIDL | SHGFI_SYSICONINDEX);
 uIcon = uSelectedIcon = shfi.iIcon;
 //if((Attributes & SFGAO_FOLDER) == SFGAO_FOLDER)
 {
  ::SHGetFileInfo((LPCTSTR)lpidlTemp, SFGAO_SHARE, &shfi, sizeof(shfi),
     SHGFI_PIDL | SHGFI_SYSICONINDEX | SHGFI_OPENICON);
  uSelectedIcon = shfi.iIcon;
 }

 // 一个新的结点
 LPFOLDERNODE  lpNewNode = new FOLDERNODE;
 lpNewNode->widlen    = wParentPIDLLen + pidlen;
 lpNewNode->pidl      = lpidlNew;
 strcpy(lpNewNode->cPath, (LPCTSTR)strPath);
 lpNewNode->bHasParent = (hParent != NULL);
 //lpNewNode->pChangeThread = NULL;
 //lpNewNode->VolSer      = 1;
 // 结点的类型(只要和几个固定的名字比较一下啦)
 if(strPath.Compare(c_cMyComputer) == 0)
  lpNewNode->fType = ftMyComputer;
 else if(strPath.Compare(c_cNetworkNeighborhood) == 0)
  lpNewNode->fType = ftNetworkNeighborhood;
 else if(strPath.Compare(c_cRecycleBin) == 0)
  lpNewNode->fType = ftRecycleBin;
 else
  lpNewNode->fType     = ftFolder;
 lpNewNode->dwAttributes = Attributes;
 lpNewNode->pMonitorThread = NULL;

 // 获取该文件夹对应的IShellFolder接口
 // If this Node has no parent, it mut be the Desktop.
 if(lpfnParent != NULL)
 {
  lpfnParent->pShellFolder->BindToObject(lpidl, NULL, IID_IShellFolder,
       (void**)&lpNewNode->pShellFolder);
  //if(lpfnParent->fType == ftNetworkNeighborhood)
  //{
  // lpNewNode->fType = ftNetNode;
  // sprintf(lpNewNode->cPath, "\\\\%s", (LPCTSTR)strFileName);
  //}

 }
 else
 {
  // 桌面的IShellFolder
  ::SHGetDesktopFolder(&lpNewNode->pShellFolder);
 }

 // 插入树结点
 TVINSERTSTRUCT  tvis;
 tvis.item.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE |
     TVIF_STATE | TVIF_PARAM;
 // 如果该文件夹包含子文件夹,则对应的树结点也应该有子结点
 if(Attributes & SFGAO_HASSUBFOLDER)
 {
  tvis.item.mask |= TVIF_CHILDREN;
  // 使用 I_CHILDRENCALLBACK 值告诉控件,该结点有子结点,但具体的结点还没给出
  // 当该结点被展开时就会通知父窗口.这时你应该为该结点添加子结点
  tvis.item.cChildren = I_CHILDRENCALLBACK;
 }

 // 设置覆盖图标
 if(Attributes & SFGAO_SHARE)      // 共享的
  tvis.item.state = INDEXTOOVERLAYMASK(1);
 else if(Attributes & SFGAO_LINK)  // 快捷方式
  tvis.item.state = INDEXTOOVERLAYMASK(2);
 else                              // 其它的
  tvis.item.state = INDEXTOOVERLAYMASK(0);

 tvis.item.stateMask = TVIS_OVERLAYMASK;  // 指明状太标志包含覆盖图标
 tvis.item.iImage = uIcon;                // 正常图标
 tvis.item.iSelectedImage = uSelectedIcon;// 选中时的图标
 //CString strTemp = strFileName + "(" + strPath + ")"; // 看看它的完整路径
 tvis.item.pszText = (char*)fpl.cNormal;  // 标题
 tvis.hParent = hParent;                  // 父结点
 tvis.hInsertAfter = TVI_LAST;            // 插入到其它兄弟结点的后面
 tvis.item.lParam = (DWORD)lpNewNode;     // 自定义的结点数据

 HTREEITEM hIns = tree.InsertItem(&tvis);  // 插入该结点

 if(hIns == NULL)   // 插入失败??不大可能的事
  FreeNodeData(lpNewNode);

 return hIns;       // 返回新结点句柄
}

// GetPath returns the path name for true folders, and a null string
// for virtual folders.
CString CShellFolderView::GetPath(HTREEITEM hNode)
{
 CString strPath("");

 if(hNode == NULL) return strPath;

 // 对于虚拟文件夹返回空串
 switch(((LPFOLDERNODE)(GetTreeCtrl().GetItemData(hNode)))->fType)
 {
 case ftNetworkNeighborhood:
 case ftNetNode:
 case ftRecycleBin:
 case ftMyComputer:
  return strPath;
 }

 // 对于真正的文件夹返回绝对路径
 strPath = ((LPFOLDERNODE)(GetTreeCtrl().GetItemData(hNode)))->cPath;

 if(strPath.GetLength() > 0)         // If path is null, it''''s a virtual folder
 {
  if(strPath.GetLength() < 3)     // If the result is less than 3 bytes,
   strPath += "\\";            //  It''''s the root -- add a "\".
 }

 return strPath;
}

// 对目录进行排序的回调函数
// The lParam1 and lParam2 parameters correspond to the lParam member
//      of the TVITEM structure for the two items being compared.
// The lParamSort parameter corresponds to the lParam member of this structure.

static int CALLBACK  ShortItemProc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)

上一页  [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……
    咸宁网络警察报警平台