www.pudn.com > 人体步态跟踪识别bate版.rar > DirectoryTree.cpp


 
#include "stdafx.h" 
#include "resource.h" 
#include "DirectoryTree.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
#define MAX_DIR_LENGTH 1024 
 
///////////////////////////////////////////////////////////////////////////// 
// CDirectoryTree 
 
CDirectoryTree::CDirectoryTree() 
{ 
	// 初始化成员变量 
	m_szCurrentDir.Empty(); 
	m_cCurrentDrive = 'a';	// 最初标志 
 
	// 初始化图标ID 
	n_TreeIconClosed    = 0; 
	n_TreeIconClosedSel = 1; 
	n_TreeIconOpen      = 2; 
	n_TreeIconOpenSel   = 3; 
} 
 
CDirectoryTree::~CDirectoryTree() 
{ 
} 
 
 
BEGIN_MESSAGE_MAP(CDirectoryTree, CTreeCtrl) 
	//{{AFX_MSG_MAP(CDirectoryTree) 
	ON_NOTIFY_REFLECT(NM_DBLCLK, OnDblclk) 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CDirectoryTree message handlers 
 
BOOL CDirectoryTree::Initialize() 
{ 
	//读取目录结构,并高亮显示当前目录 
	HTREEITEM       hTreeItem;				// Result of adding new item to tree 
	HTREEITEM       hTreeParent;			// Parent of recently added item 
	DWORD           dwRes = 0;				// Result code 
	TV_INSERTSTRUCT tvstruct;				// Info for inserting Tree items 
	int             nNumNodes = 0;			// Number of nodes initialized 
	int             i = 0;					// Generic counter variable 
	char            szPath[MAX_DIR_LENGTH];	// Buffer to hold path information 
	char            szSeps[] = "\\";		// Separators to use with _tcstok() 
	char *          token;					// Buffer to hold the token returned by _tcstok() 
 
	if ('a' != m_cCurrentDrive) 
	{ 
		CString s; 
		s.Format("%c:", m_cCurrentDrive); 
		SetCurrentDirectory(s); 
		DeleteAllItems(); 
	} 
 
	// 获取当前目录,并高亮显示 
	dwRes = GetCurrentDirectory(MAX_DIR_LENGTH, szPath); 
	if (0 == dwRes) 
	{ 
		LPVOID lpMsgBuf; 
		FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM, 
					  NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), 
					  (LPTSTR) &lpMsgBuf, 0, NULL); 
		MessageBox((LPTSTR)lpMsgBuf, "GetLastError", MB_OK|MB_ICONERROR); 
		LocalFree(lpMsgBuf); 
		return FALSE; 
	} 
 
	// 保存当前路径和盘符 
	m_szCurrentDir = szPath; 
	m_cCurrentDrive = szPath[0]; 
 
	// 填充从盘符到当前目录的目录树 
	hTreeParent = TVI_ROOT; 
	token =  _tcstok(szPath, szSeps); 
	while (token) 
	{ 
		// 在目录树中增加项 
		tvstruct.hParent = hTreeParent; 
		tvstruct.hInsertAfter = TVI_LAST; 
		tvstruct.item.iImage = n_TreeIconOpen; 
		tvstruct.item.iSelectedImage = n_TreeIconOpenSel; 
		tvstruct.item.pszText = token; 
		tvstruct.item.mask = TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_TEXT; 
		hTreeItem = InsertItem(&tvstruct); 
		hTreeParent = hTreeItem; 
		nNumNodes++;	// 节点数量 
 
		token = _tcstok(NULL, szSeps); 
	} 
 
	// 自动展开目录树 
	hTreeParent = hTreeItem = NULL; 
	hTreeItem   = GetRootItem(); 
	for (i=0; iPostMessage(WM_USER_PATHCHANGED); 
 
	return; 
} 
 
void CDirectoryTree::DeleteChildren(HTREEITEM htItem/*路径尾*/) 
{ 
	//删除刚展开的项的子项 
	HTREEITEM hTreeChild1;	// A child of the item 
	HTREEITEM hTreeChild2;	// A child of the item 
 
	if (ItemHasChildren(htItem)) 
	{ 
		hTreeChild1 = GetChildItem(htItem); 
		if (hTreeChild1) 
		{ 
			if (ItemHasChildren(hTreeChild1)) 
			{ 
				hTreeChild2 = GetChildItem(hTreeChild1); 
				while (hTreeChild2) 
				{ 
					DeleteItem(hTreeChild2); 
					hTreeChild2 = GetChildItem(hTreeChild1); 
				} 
			} 
 
			DeleteItem(hTreeChild1); 
		} 
	} 
 
	return; 
} 
 
void CDirectoryTree::DeletePeers(HTREEITEM htItem/*路径尾*/) 
{ 
	//删除刚展开的项的同级项 
	HTREEITEM hTreePeer; 
 
	// 删除所有同级项 
	hTreePeer = GetPrevSiblingItem(htItem); 
	while (hTreePeer) 
	{ 
		DeleteItem(hTreePeer); 
		hTreePeer = GetPrevSiblingItem(htItem); 
	} 
 
	hTreePeer = GetNextSiblingItem(htItem); 
	while (hTreePeer) 
	{ 
		DeleteItem(hTreePeer); 
		hTreePeer = GetNextSiblingItem(htItem); 
	} 
 
	return; 
} 
 
void CDirectoryTree::OnDblclk(NMHDR* pNMHDR, LRESULT* pResult)  
{ 
	//处理NM_DBLCLK消息(双击目录树中某项时发送) 
	HTREEITEM hTreeItem;		// The item's Handle 
	HTREEITEM hTreeChild;		// A child of the item 
	UINT      uItemState;		// The item's current state 
	int       nImage;			// The ID of the image in the list 
	int       nSelImage;		// The ID of the selected image in the list 
 
	// 获取双击项 
	hTreeItem  = GetSelectedItem(); 
	uItemState = GetItemState(hTreeItem, TVIF_STATE); 
 
	if (uItemState & TVIS_EXPANDED) 
	{ 
		if (ItemHasChildren(hTreeItem)) 
		{ 
			hTreeChild = GetChildItem(hTreeItem); 
			if (hTreeChild) 
			{ 
				GetItemImage(hTreeChild, nImage, nSelImage); 
				if ((nImage == n_TreeIconClosed) ||  
					(nSelImage == n_TreeIconClosedSel)) 
				{ 
					*pResult = 1; 
					return; 
				} 
			} 
		} 
 
		DeleteChildren(hTreeItem); 
		BuildPathFromTree(hTreeItem); 
		AddDirsToTree(m_szCurrentDir, hTreeItem); 
	} 
	else 
	{ 
		SetItemImage(hTreeItem, 2, 3); 
 
		DeletePeers(hTreeItem); 
		BuildPathFromTree(hTreeItem); 
		AddDirsToTree(m_szCurrentDir, hTreeItem); 
	} 
 
	*pResult = 1; 
	return; 
} 
 
void CDirectoryTree::SetBitmapList(CImageList * pBmpList) 
{ 
	SetImageList(pBmpList, TVSIL_NORMAL); 
} 
 
void CDirectoryTree::SetBitmapOrder(int nClosed = 0, int nClosedSel = 1, int nOpen = 2, int nOpenSel = 3) 
{ 
	n_TreeIconClosed    = nClosed; 
	n_TreeIconClosedSel = nClosedSel; 
	n_TreeIconOpen      = nOpen; 
	n_TreeIconOpenSel   = nOpenSel; 
} 
 
IMPLEMENT_DYNAMIC(CDirectoryTree, CTreeCtrl)