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)