⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 leftview.cpp

📁 《Visual C++.NET MFC类库应用详解》程序实例
💻 CPP
字号:
// LeftView.cpp : CLeftView 类的实现
//

#include "stdafx.h"
#include "FileExplorer.h"
#include "FileExplorerDoc.h"
#include "LeftView.h"
#include "FileExplorerView.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// CLeftView

IMPLEMENT_DYNCREATE(CLeftView, CTreeView)

BEGIN_MESSAGE_MAP(CLeftView, CTreeView)
	ON_NOTIFY_REFLECT(TVN_SELCHANGED, OnTvnSelchanged)
	ON_NOTIFY_REFLECT(TVN_ITEMEXPANDING, OnTvnItemexpanding)
END_MESSAGE_MAP()


// CLeftView 构造/销毁

CLeftView::CLeftView()
{
	// TODO: 在此处添加构造代码
}

CLeftView::~CLeftView()
{
}

BOOL CLeftView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: 在此处通过修改 CREATESTRUCT cs 来修改窗口类或样式
	cs.dwExStyle |= TVS_HASLINES | TVS_HASBUTTONS;
	return CTreeView::PreCreateWindow(cs);
}

void CLeftView::OnInitialUpdate()
{
	CTreeView::OnInitialUpdate();

	// 调用 GetTreeCtrl()直接访问TreeView的树控件,从而可以用项填充TreeView。
	CTreeCtrl& m_FolderTree = GetTreeCtrl();
	CImageList* pImageList = new CImageList();
	pImageList->Create(16, 16, TRUE, 5, 2);

	CBitmap bitmap;
	for (UINT iCnt=IDB_BITMAP1; iCnt<=IDB_BITMAP4; iCnt++)
	{
		bitmap.LoadBitmap(iCnt);
		pImageList->Add(&bitmap, (COLORREF)0xFFFFFF);
		bitmap.DeleteObject();
	}
	m_FolderTree.SetImageList(pImageList, TVSIL_NORMAL);
	//初始化目录树控件
	FillTreeCtrl();	
}


// CLeftView 诊断

#ifdef _DEBUG
void CLeftView::AssertValid() const
{
	CTreeView::AssertValid();
}

void CLeftView::Dump(CDumpContext& dc) const
{
	CTreeView::Dump(dc);
}

CFileExplorerDoc* CLeftView::GetDocument() // 非调试版本是内联的
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CFileExplorerDoc)));
	return (CFileExplorerDoc*)m_pDocument;
}
#endif //_DEBUG


// CLeftView 消息处理程序

void CLeftView::FillTreeCtrl(const CString& strDir)
{
	CTreeCtrl& m_FolderTree = GetTreeCtrl();

	CWaitCursor cursor; // 显示等待光标
	// 删除控件中所有内容
	m_FolderTree.DeleteAllItems();

	CString cstr = _T("/");
	//将根目录插入树状结构
	TV_INSERTSTRUCT tvstruct;
	tvstruct.hParent = NULL;
	tvstruct.hInsertAfter = TVI_LAST;
	tvstruct.item.iImage =0;
	tvstruct.item.iSelectedImage = 0;
	tvstruct.item.pszText = _T("我的电脑");
	tvstruct.item.mask = TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_TEXT;
	HTREEITEM hThisItem = m_FolderTree.InsertItem(&tvstruct);
	// 根目录需要调用Expand()展开子项
	tvstruct.hParent = hThisItem;
	m_FolderTree.InsertItem(&tvstruct);
	m_FolderTree.Expand(m_FolderTree.GetRootItem(), TVE_EXPAND);
	//如果没有子项,取消TVS_LINESATROOT风格
	if (!m_FolderTree.ItemHasChildren(m_FolderTree.GetRootItem()))
	{
		m_FolderTree.ModifyStyle(TVS_LINESATROOT, 0);
		return;
	}
	// 如果有子项,则设置TVS_LINESATROOT风格
	m_FolderTree.ModifyStyle(0, TVS_LINESATROOT);
	if (!strDir)
		return;
	//只要有子项就反复展开
	int nIndex;
	CString strTemp;
	CString strSrc = strDir;
	HTREEITEM hTI = m_FolderTree.GetRootItem();
	while (!strSrc.IsEmpty())
	{
		nIndex = strSrc.Find(_T("\\"));
		if (nIndex < 0)
		{
			cstr = strSrc;
			strSrc.Empty();
		}
		else if (nIndex > 0)
		{ // 跟踪没有列出的目录
			cstr = strSrc.Left(nIndex);
			strTemp = strSrc.Right(strSrc.GetLength() - (nIndex+1));
			strSrc = strTemp;
		}
		if(!cstr.IsEmpty() && (nIndex != 0))
		{
			// 检查CStr是文件还是目录
			hTI = m_FolderTree.GetChildItem(hTI);
			while ((hTI != NULL) && (cstr != m_FolderTree.GetItemText(hTI)))
			{
				hTI = m_FolderTree.GetNextItem(hTI, TVGN_NEXT);
			}
			if ((hTI != NULL) && (cstr == m_FolderTree.GetItemText(hTI)))
			{
				if (m_FolderTree.ItemHasChildren(hTI))
					m_FolderTree.Expand(hTI, TVE_EXPAND);
				else
				{
					m_FolderTree.SelectItem(hTI);  
					TV_ITEM tv;
					tv.hItem = hTI;
					tv.mask = TVIF_HANDLE | TVIF_STATE;
					tv.stateMask = TVIS_BOLD;
					if (m_FolderTree.GetItem(&tv))
					{
						tv.mask = TVIF_HANDLE | TVIF_STATE;
						tv.stateMask = TVIS_BOLD;
						tv.state = TVIS_BOLD;
						m_FolderTree.SetItem(&tv);
					}
					strSrc.Empty(); 
				}
			}
			
			else strSrc.Empty();
		}
		else // nIndex == 0
		{
			strTemp = strSrc.Right(strSrc.GetLength() - 1);
			strSrc = strTemp;
		}
	} // 结束展开
}


void CLeftView::ExploreDir(const CString& strDir, HTREEITEM hParent)
{
	CTreeCtrl& m_FolderTree = GetTreeCtrl();

	TV_INSERTSTRUCT tvstruct;
	CString strSearchDir;
	//删除该目录中所有的子项
	HTREEITEM hIT = m_FolderTree.GetChildItem(hParent);
	HTREEITEM hTemp;
	while (hIT != NULL)
	{
		hTemp = m_FolderTree.GetNextSiblingItem(hIT);
		m_FolderTree.DeleteItem(hIT);
		hIT = hTemp;
	}
	// 查找该目录中所有的文件
	if (hParent != m_FolderTree.GetRootItem())
		strSearchDir = strDir + _T("\\");
	else
		strSearchDir = _T("");

	BOOL bDir = FALSE;
	HTREEITEM hThisItem;

	if(strSearchDir == "")  //查找盘符
	{	
		char DriveChar;
		UINT DriveType;
		char lpRootPathName[256]="";
		DWORD DriveBits = (DWORD)GetLogicalDrives();
		for (DWORD DriveNum = 0,Num=1; DriveNum<26; DriveNum++,Num = Num * 2)
		{
			if ((Num & DriveBits)==0) continue;
			DriveChar = char(DriveNum) + 'a';
			memset(lpRootPathName,0,256);
			lpRootPathName[0]=DriveChar;
			strcat(lpRootPathName,":\\");
			DriveType = GetDriveType((LPCTSTR)lpRootPathName);
			switch(DriveType)
			{
			case DRIVE_REMOVABLE: 
			case DRIVE_FIXED: 
			case DRIVE_REMOTE: 
			case DRIVE_CDROM: 
			case DRIVE_RAMDISK: 
				bDir = TRUE;
				tvstruct.item.iImage = 3;
				tvstruct.item.iSelectedImage = 3;
				tvstruct.hParent = hParent;
				tvstruct.hInsertAfter = TVI_LAST;
				tvstruct.item.pszText = (LPTSTR)(LPCTSTR)lpRootPathName;
				tvstruct.item.mask = TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_TEXT;
				hThisItem = m_FolderTree.InsertItem(&tvstruct);
				break;
			}
		}	
	
	
	}
	else   //查找文件夹
	{
        CFileFind fFind;
        CString strSearchDirNew,strFileName;
	    if(strSearchDir.Right(1)!="\\")
		    strSearchDirNew = strSearchDir + "\\*.*";
	    else
		    strSearchDirNew = strSearchDir + "*.*";
        BOOL bContinue=fFind.FindFile(strSearchDirNew);
		if(!bContinue){	fFind.Close();	return;	}
		while(bContinue)
		{
            bContinue=fFind.FindNextFile();
			strFileName=fFind.GetFileName();
			if(fFind.IsDots())continue;
			if(fFind.IsDirectory())
			{
				bDir = TRUE;
				tvstruct.item.iImage = 1;
				tvstruct.item.iSelectedImage = 2;
				tvstruct.hParent = hParent;
				tvstruct.hInsertAfter = TVI_LAST;
				tvstruct.item.pszText = (LPTSTR)(LPCTSTR)strFileName;
				tvstruct.item.mask = TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_TEXT;
				hThisItem = m_FolderTree.InsertItem(&tvstruct);
			}
		}
        fFind.Close();
	}
	// 如果找到非空目录,则创建一个临时子项 
	if (bDir)
	{
		int nImage, nSelectedImage;
		hThisItem = m_FolderTree.GetChildItem(hParent);
		while (hThisItem != NULL)
		{
			m_FolderTree.GetItemImage(hThisItem, nImage, nSelectedImage);
			if ((nImage == 1) ||(nImage ==3)) //为目录
			{
				tvstruct.hParent = hThisItem;
				tvstruct.hInsertAfter = TVI_LAST;
				tvstruct.item.iImage = 1;
				tvstruct.item.iSelectedImage = 2;
				tvstruct.item.pszText = _T("1");;
				tvstruct.item.mask = TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_TEXT;
				m_FolderTree.InsertItem(&tvstruct);
			}
			hThisItem = m_FolderTree.GetNextSiblingItem(hThisItem);
		}
	}
	return;
}

void CLeftView::OnTvnSelchanged(NMHDR *pNMHDR, LRESULT *pResult)
{
	LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);
	// TODO: 在此添加控件通知处理程序代码
	*pResult = 0;

	CTreeCtrl& m_FolderTree = GetTreeCtrl();
	HTREEITEM hIT  = m_FolderTree.GetSelectedItem();
	CString cstr, strPath;
	// 创建htreeitem路径
	strPath = m_FolderTree.GetItemText(hIT);
	while (hIT != m_FolderTree.GetRootItem())
	{
		hIT = m_FolderTree.GetParentItem(hIT);
		if (hIT == m_FolderTree.GetRootItem())
			cstr.Format(_T("%s"), (LPCTSTR)strPath);
		else
			cstr.Format(_T("%s\\%s"), (LPCTSTR)m_FolderTree.GetItemText(hIT), (LPCTSTR)strPath);
		strPath = cstr;
	}
	GetDocument()->m_pListView->SetRedraw(FALSE);
	GetDocument()->m_pListView->ExploreFile(strPath);
	GetDocument()->m_pListView->SetRedraw(TRUE);
}

void CLeftView::OnTvnItemexpanding(NMHDR *pNMHDR, LRESULT *pResult)
{
	LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);
	// TODO: 在此添加控件通知处理程序代码

	CTreeCtrl& m_FolderTree = GetTreeCtrl();
	if ((pNMTreeView->itemNew.state & TVIS_EXPANDEDONCE))
		return;
	if (pNMTreeView->hdr.code == TVN_ITEMEXPANDING)
	{
		HTREEITEM hIT = pNMTreeView->itemNew.hItem;
		CString cstr, strPath;
		// 创建htreeitem路径
		strPath = m_FolderTree.GetItemText(hIT);
		while (hIT != m_FolderTree.GetRootItem())
		{
			hIT = m_FolderTree.GetParentItem(hIT);
			if (hIT == m_FolderTree.GetRootItem())
				cstr.Format(_T("%s"), (LPCTSTR)strPath);
			else
				cstr.Format(_T("%s\\%s"), (LPCTSTR)m_FolderTree.GetItemText(hIT), (LPCTSTR)strPath);
			strPath = cstr;
		}
		// 调用函数ExploreDir
		
		ExploreDir(strPath, pNMTreeView->itemNew.hItem);
	}	
	*pResult = 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -