边城浪子(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文件系统的反删除方法
|