📄 leftview.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 + -