-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathFileResTree.h
More file actions
167 lines (124 loc) · 4.65 KB
/
FileResTree.h
File metadata and controls
167 lines (124 loc) · 4.65 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
#if !defined(AFX_DIRTREE_H__DAA4C1B7_EDAB_4A46_ACFF_CAEA495B6793__INCLUDED_)
#define AFX_DIRTREE_H__DAA4C1B7_EDAB_4A46_ACFF_CAEA495B6793__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// DirTree.h : header file
//
#include "FileResList.h"
#include "ShellPidl.h"
#include "ShellString.h"
#include "ShellContextMenu.h"
class CDirWatcher;
/////////////////////////////////////////////////////////////////////////////
// CFileResTree window
//目录树控件,采用树的方式展示本机的所有文件目录
class CFileResTree : public CTreeCtrl
{
private:
struct TVITEMDATA
{
SShellFolderPtr pParentFolder;
CShellPidl pidlAbs;
UINT nFlags;
BOOL IsValid()
{
return (this != NULL)
&& pParentFolder.IsValid() && pidlAbs.IsValid();
}
};
static CMenu* FindMenuItemByText(CMenu* pMenu, LPCTSTR pszText, UINT &nIndex, BOOL bRecursive = TRUE);
// Construction
public:
CFileResTree();
//初始化
void Initial();
//获取当前选择的节点(目录或文件)的绝对路径
CString GetSelectedFullPath();
//设置相关的列表视图
void SetRelatedList(CFileResList* listctrl){m_lstRelated = listctrl;}
//设置相关的地址栏
void SetRelatedEdit(CEdit* address){m_edtAddress = address;}
//从某节点往下查找指定名称的节点
//采用深度遍历树来查找对应的节点
//很有可能查不到,因为树并不完整,没有保存所有的节点
HTREEITEM FindItemText(HTREEITEM itemCurrent, CString strtext);
//采用广度遍历树的算法来查找对应的节点,就是在树种逐层查找,而不是按照一个分支往下查找
//很有可能查不到,因为树中没有保存所有的节点
HTREEITEM FindItem(HTREEITEM itemCurrent,CString strPath);
BOOL GetItemContextMenu(HTREEITEM hItem, CShellContextMenu &rCtxMenu);
protected:
//插入节点
HTREEITEM InsertItemToTree(HTREEITEM hParent, CString strPath,CString DisplayName);
// 获取盘符到目录树,作为根目录下一级节点
void GetLogicalDrives(HTREEITEM hRoot);
// 获取驱动器下一级目录到目录树上显示
void GetDriveDir(HTREEITEM hRoot);
// 获取某节点的文件路径
CString GetFullPath(HTREEITEM hParent);
//初始化指定节点
void InitItem(HTREEITEM hParent);
//删除指定节点下的所有子节点
void DeleteChildItems(HTREEITEM hParent);
//更新指定的节点
void UpdateItem(HTREEITEM hParent);
//更新相关联的控件
void UpdateRelatedCtrls();
//指定的目录是否含有子文件或目录
bool IsDirHasChildren(CString strPath);
//指定的目录是否为空
bool IsDirEmpty(CString strPath);
void EnableContextMenu(BOOL bEnable)
{
m_bContextMenu = bEnable;
}
//-----------------------------------------------------------------------
// Summary:
// This member function displays the system popup menu for the selected
// item or folder.
// Returns:
// A handle to the currently selected HTREEITEM.
//-----------------------------------------------------------------------
virtual HTREEITEM GetContextMenu();
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CFileResTree)
//}}AFX_VIRTUAL
// Implementation
public:
virtual ~CFileResTree();
// Generated message map functions
protected:
//{{AFX_MSG(CFileResTree)
afx_msg void OnItemexpanded(NMHDR* pNMHDR, LRESULT* pResult);
afx_msg void OnSelchanged(NMHDR* pNMHDR, LRESULT* pResult);
afx_msg LRESULT OnUpdateShell(WPARAM wParam, LPARAM lParam);
afx_msg void OnRclick(NMHDR* pNMHDR, LRESULT* pResult);
afx_msg void OnDblclk(NMHDR* pNMHDR, LRESULT* pResult);
afx_msg void OnContextMenu(CWnd* pWnd, CPoint point);
afx_msg void OnShellCommand(UINT nID);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
private:
// //节点类型,保存在节点itemdata中
// enum ITEM_TYPE
// {
// TYPE_INVALID = -1, //该节点是无效节点,将会被删除
// TYPE_EMPTY = 0, //该节点不含子节点(不含目录)
// TYPE_HASINVALIDSUBITEM, //该节点含有一个无效节点的节点,表示该目录下含子目录,但是目前只添加了一个空的子目录
// TYPE_HASVALIDSUBITEM}; //该节点含有一个或多个有效节点
BOOL m_bShowDirOnly;//只显示文件夹
BOOL m_bShowHide;//显示隐藏文件(夹)
BOOL m_bShowSystem;//显示系统文件
CImageList m_ImageList;//图标列表
HTREEITEM m_hRoot;//根节点
CFileResList* m_lstRelated;//关联的列表框,显示当前选择的目录下所有的目录和文件
CEdit* m_edtAddress;//关联的编辑框,显示当前绝对路径
CDirWatcher* m_pDirThread;//监测指定目录活动的线程
BOOL m_bContextMenu; //是否显示右键菜单
CShellContextMenu m_shellMenu;
};
/////////////////////////////////////////////////////////////////////////////
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_DIRTREE_H__DAA4C1B7_EDAB_4A46_ACFF_CAEA495B6793__INCLUDED_)