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

仿Explorer的目录树视图类

作者:闵涛 文章来源:闵涛的学习笔记 点击数:4094 更新时间:2009/4/25 0:44:57

边城浪子(QQ:16168666)

在网上找了很长时间也没有关于这方面的VC代码.倒是找到几个控件,用起来却很不爽.很奇怪WINDOWS里为什么没有这样的控件.没办法.自己实现一个呗.
下面这个类从CTreeView拜生.参考了DELPHI的相应控件源代码写的,本人对DELPHI不会,所以看得很勉强,好多地方也没看明白.不过这个类使用起来的效果,嘿嘿.已经和那个控件差不多了:).只是比起Explorer里的来,还差着一些.具体差在什么地方,大家用一用就知道了.

将你的类从此类拜生,就能做你想做的了. 该类只导出两个函数:
1.SetCurPath :  设置选中一个路径.如果需要的话,它会展开相应有文件夹
2.GetSelectedDir : 返回当前选中的文件夹,没有选中的话,返回自然就是空串

如果你有兴趣,自己对这个类进行扩充吧.欢迎和我交流.


//////////////////////////////////////////////////////////////////////////
// ShellFolderView.h  ----   头文件
#if !defined(AFX_SHELLFOLDERVIEW_H__D30D10ED_3D11_4873_9909_146B8E18BEB1__INCLUDED_)
#define AFX_SHELLFOLDERVIEW_H__D30D10ED_3D11_4873_9909_146B8E18BEB1__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// ShellFolderView.h : header file
//**********************************************************************
// 该类根据DELPHI相应控件源代码改编
/***********************************************************************
 简介:
 CShellFolderView从CTreeView拜生,它显示整个WINDOWS的文件目录树.在WINDOWS中
 又叫外壳名字空间(Shell Name Space).外壳名字空间是Windows下的标准文件系统,
 它大大扩展了Dos文件系统,形成了以“桌面”(Desktop)为根的单一的文件系统
 树,原有的C盘、D盘等目录树变成了“我的电脑”这一外壳名字空间子树的下一级
 子树,而像“控制面板”、“回收站”、“网上邻居”等应用程序及“打印机”等设
 备也被虚拟成了外壳名字空间中的节点。另外,与DOS中物理存储只能和文件系统
 项一一对应这一点不同的是,一个实际目录在外壳名字空间中可以表现为不同的项。
 例如“我的文档”与“C:\My Documents”其实都指向“C:\My Documents”目录,但
 它们在外壳名字空间中是不同的项。

 外壳名字空间下的路径: PIDL
 PIDL是一个元素类型为ITEMIDLIST结构的数组,数组中元素的个数是未知的,但紧接
 着数组末尾的必是一个双字节的零。每个数组元素代表了外壳名字空间树中的一层(
 即一个文件夹或文件),数组中的前一元素代表的是后一元素的父文件夹。由此可见,
 PIDL实际上就是指向一块由若干个顺序排列的ITEMIDLIST结构组成、并在最后有一个
 双字节零的空间的指针。所以PIDL的类型就被Windows定义为ITEMIDLIST结构的指针。

 PIDL亦有“绝对路径”与“相对路径”的概念。表示“相对路径”的PIDL只有一个
 ITEMIDLIST结构的元素,用于标识相对于父文件夹的“路径”;表示“绝对路径”的
 PIDL(简称为“绝对PIDL”)有若干个ITEMIDLIST结构的元素,第一个元素表示外壳
 名字空间根文件夹(“桌面”)下的某一子文件夹A,第二个元素则表示文件夹A下的
 某一子文件夹B,其余依此类推。这样绝对PIDL就通过保存一条从“桌面”下的直接子
 文件夹或文件的绝对PIDL与相对PIDL是相同的,而其他的文件夹或文件的相对PIDL就
 只是其绝对PIDL的最后一部分了。由于所有的PIDL都是从桌面下的某一个子文件夹开
 始的,所以对于桌面本身来说,它的PIDL数组显然一个元素都没有。这样就只剩下PIDL
 数组最后的那个双字节的零了。所以,“桌面”的PIDL就是一个16位的零。

  **********************************************************************/
// 监视指定的文件夹的变化的类. 该类由CShellFolderView专用,所以定义在源文件中
// 不对外部公开,在这里进行提前声明,因为下面要用到
class  CFolderChangeMonitor;  

// 外壳名字空间下结点的串表示
typedef struct _FILEPATHLIST
{
 char cNormal[MAX_PATH];     // 绝对名称(如,"我的电脑")
 char cForParsing[MAX_PATH]; // 用来分析解释的名称, 可以根据它来产生PIDL
 char cInFolder[MAX_PATH];   // 相对名称
} FILEPATHLIST, *LPFILEPATHLIST;

// 文件夹的分类
typedef enum emFolderType{
 ftFolder,               // 文件夹
 ftNetworkNeighborhood,  // 网上邻居
 ftRecycleBin,           // 回收站
 ftMyComputer,           // 我的电脑
 ftDesktop,              // 桌面
 ftNetNode,              // 网络结点
 ftNone                  // 空
}FOLDERTYPE;

// 路径信息
typedef struct _PATHINFO{
     char           cPath[MAX_PATH];  // 路径
     char           cText[MAX_PATH];  // 名称
     UINT           uIconIndex;       // 图标索引
     UINT           uSelectedIndex;   // 选中时的图标索引
     LPITEMIDLIST   pidl;             // PIDL
}PATHINFO,*LPPATHINFO;

// 结点数据
typedef struct _FOLDERNODE{
 char          cPath[MAX_PATH];   // 路径
 BOOL          bHasParent;        // 是否有父结点
 LONG          Vol_Ser;           // 卷标
 ULONG         dwAttributes;      // 属性
 FOLDERTYPE    fType;             // 类型
 IShellFolder* pShellFolder;      // 指向该文件夹的IShellFolder接口
 LPITEMIDLIST  pidl;              // 文件夹的PIDL
 WORD          widlen;            // PIDL的长度
 CFolderChangeMonitor*  pMonitorThread; // 监视文件夹变化的线程
}FOLDERNODE, *LPFOLDERNODE;

/////////////////////////////////////////////////////////////////////////////
// CShellFolderView view

class CShellFolderView : public CTreeView
{
protected:
 CShellFolderView();           // protected constructor used by dynamic creation
 DECLARE_DYNCREATE(CShellFolderView)

// Attributes
public:

// Operations
public:
 BOOL SetCurPath(LPCTSTR lpszPath);    // 设置当前选中的文件夹, 成功返回TRUE
 CString GetSelectedDir();             // 取得当前选中的文件夹,没有则返回一个空串

// Overrides
 // ClassWizard generated virtual function overrides
 //{{AFX_VIRTUAL(CShellFolderView)
 protected:
 //virtual void OnDraw(CDC* pDC);      // overridden to draw this view
 //}}AFX_VIRTUAL

// Implementation
protected:
 virtual ~CShellFolderView();
#ifdef _DEBUG
 virtual void AssertValid() const;
 virtual void Dump(CDumpContext& dc) const;
#endif

 // Generated message map functions
protected:
 //{{AFX_MSG(CShellFolderView)
 afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
 afx_msg void OnItemexpanding(NMHDR* pNMHDR, LRESULT* pResult);
 afx_msg void OnDestroy();
 //}}AFX_MSG
 afx_msg LRESULT OnFolderChanged(WPARAM wParam, LPARAM); // 处理文件夹发生变化的消息
 DECLARE_MESSAGE_MAP()
private:
 IMalloc*      m_pMalloc;      // COM内存分配接口用来分配和回收PIDL使用的空间
protected:
 void GetSpecialFolder(int nFolder, LPPATHINFO  lppi); // 取得指定的特殊文件夹的信息
 void GetNetHood(LPPATHINFO lpPI);        // 取得网上邻居结点
 // 创建一个结点
 HTREEITEM CreateFolderNode(LPITEMIDLIST lpidl, HTREEITEM hParent, BOOL bVirtual);
 CString Ge

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