📄 leftview.cpp
字号:
// LeftView.cpp : implementation of the CLeftView class
//
#include "stdafx.h"
#include "Explore.h"
#include "MainFrm.h"
#include "LeftView.h"
#include "ExploreDoc.h"
#include "ExploreView.h"
#include "Globle.h"
#include "DlgAttribute.h"
#include "DldRename.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CLeftView
IMPLEMENT_DYNCREATE(CLeftView, CTreeView)
BEGIN_MESSAGE_MAP(CLeftView, CTreeView)
//{{AFX_MSG_MAP(CLeftView)
ON_NOTIFY_REFLECT(TVN_SELCHANGED, OnSelchanged)
ON_COMMAND(ID_POPUP_DELETE, OnPopupDelete)
ON_COMMAND(ID_POPUP_PROPERTY, OnPopupProperty)
ON_COMMAND(ID_POPUP_RENAME, OnPopupRename)
ON_UPDATE_COMMAND_UI(ID_POPUP_RENAME, OnUpdatePopupRename)
ON_UPDATE_COMMAND_UI(ID_POPUP_PROPERTY, OnUpdatePopupProperty)
ON_UPDATE_COMMAND_UI(ID_POPUP_DELETE, OnUpdatePopupDelete)
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CTreeView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CTreeView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CTreeView::OnFilePrintPreview)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CLeftView construction/destruction
CLeftView::CLeftView()
{
// TODO: add construction code here
}
CLeftView::~CLeftView()
{
}
BOOL CLeftView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
// 设置树控件的风格
cs.style |= TVS_HASLINES|TVS_HASBUTTONS|TVS_LINESATROOT|TVS_SHOWSELALWAYS;
return CTreeView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CLeftView drawing
void CLeftView::OnDraw(CDC* pDC)
{
CExploreDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
}
/////////////////////////////////////////////////////////////////////////////
// CLeftView printing
BOOL CLeftView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CLeftView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CLeftView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
void CLeftView::OnInitialUpdate()
{
CTreeView::OnInitialUpdate();
// TODO: You may populate your TreeView with items by directly accessing
// its tree control through a call to GetTreeCtrl().
// 创建图像列表
m_ImageList.Create( 16, 16, ILC_COLOR16, 4, 1 );
//向图象列表添加4个图标
m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_HARDDISK));
m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_FLOPPYDISK) );
m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_FORDER1) );
m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_CD) );
m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_FORDER2) );
//取得Tree控件指针,并指出树结点的图标从m_ImageList中取得
CTreeCtrl &m_TreeCtrl = GetTreeCtrl();
m_TreeCtrl.SetImageList( &m_ImageList, TVSIL_NORMAL );
CString strDrive;
int nImage;
//查找计算机中的所有驱动器
for(char ch='A'; ch<='Z'; ch++)
{
strDrive = ch;
strDrive += ":";
UINT nDriveType = ::GetDriveType(strDrive + "\\");
if(nDriveType == DRIVE_REMOVABLE) //软驱
{
nImage = 1;
}
else if(nDriveType == DRIVE_FIXED) //硬驱
{
nImage = 0;
}
else if(nDriveType == DRIVE_CDROM) //光驱
{
nImage = 3;
}
else
continue;
HTREEITEM hItem;
TV_INSERTSTRUCT tvstruct;
tvstruct.hParent=NULL;
tvstruct.item.lParam=0;
tvstruct.item.mask=TVIF_IMAGE|TVIF_SELECTEDIMAGE|TVIF_TEXT|TVIF_PARAM;
tvstruct.item.iImage=nImage;
tvstruct.item.iSelectedImage=nImage;
char strTemp[5];
strcpy(strTemp, strDrive);
tvstruct.item.pszText = strTemp;
// 将驱动器符号作为根结点插入树控件中
hItem = m_TreeCtrl.InsertItem(&tvstruct);
CString csPath = strDrive;
//在树控件上建立该驱动器的目录结构
TreeBranchBuild(m_TreeCtrl, hItem, csPath);
strDrive.MakeUpper();
if(strDrive == "C:") //将C盘的目录结构展开
{
m_TreeCtrl.SelectItem(hItem);
m_TreeCtrl.Expand(hItem, TVE_EXPAND);
}
}
}
// 通过递归调用,建立指定目录下的目录结构
// 参数:htParent 父结点
// csPath 指定目录
void CLeftView::TreeBranchBuild(CTreeCtrl &m_TreeCtrl, HTREEITEM htParent, CString csPath)
{
CFileFind FindFile;
CString csFileName;
CString csNewPath;
HTREEITEM htNewParent;
TV_INSERTSTRUCT tvstruct;
tvstruct.hParent=htParent;
tvstruct.item.mask=TVIF_IMAGE|TVIF_SELECTEDIMAGE|TVIF_TEXT|TVIF_PARAM;
tvstruct.hInsertAfter = TVI_SORT;
csPath += "\\*.*";
BOOL bContinue = FindFile.FindFile(csPath);
//如果目录非空,进入循环
while (bContinue == TRUE)
{
bContinue = FindFile.FindNextFile();
if(FindFile.IsDots())
continue;
// 如果是子目录,则加入此结点,并递归调用此函数,建立
// 该子目录的树型目录结构
if(FindFile.IsDirectory())
{
csFileName = FindFile.GetFileName();
tvstruct.item.iImage=2;
tvstruct.item.iSelectedImage=4;
char temp[100];
strcpy(temp,csFileName);
tvstruct.item.pszText=temp;
htNewParent = m_TreeCtrl.InsertItem(&tvstruct);
csNewPath = FindFile.GetFilePath();
TreeBranchBuild(m_TreeCtrl, htNewParent, csNewPath);
}
}
FindFile.Close();
}
/////////////////////////////////////////////////////////////////////////////
// CLeftView diagnostics
#ifdef _DEBUG
void CLeftView::AssertValid() const
{
CTreeView::AssertValid();
}
void CLeftView::Dump(CDumpContext& dc) const
{
CTreeView::Dump(dc);
}
CExploreDoc* CLeftView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CExploreDoc)));
return (CExploreDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CLeftView message handlers
// 当选择的树结点改变时,在右边的列表框中显示该目录中的内容
void CLeftView::OnSelchanged(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
// TODO: Add your control notification handler code here
CString csPath = GetPathName();
CExploreApp *pApp=(CExploreApp *) AfxGetApp();
CMainFrame *pMainFrame = (CMainFrame *)pApp->GetMainWnd();
CExploreView * pRightView= (CExploreView *) pMainFrame->GetRightPane();
pRightView->ListBuild(csPath);
*pResult = 0;
}
// 获得当前树结点的绝对路径
CString CLeftView::GetPathName()
{
CString pszText, csPath, csTemp;
CTreeCtrl &m_TreeCtrl = GetTreeCtrl();
HTREEITEM hSelected=m_TreeCtrl.GetSelectedItem();
HTREEITEM hParent;
pszText=m_TreeCtrl.GetItemText(hSelected);
csPath = pszText;
while(hParent = m_TreeCtrl.GetParentItem(hSelected))
{
pszText = m_TreeCtrl.GetItemText(hParent);
csTemp = pszText + "\\";
csPath = csTemp + csPath;
hSelected = hParent;
}
return csPath;
}
void CLeftView::DeleteTreeNode(HTREEITEM hSelected)
{
CTreeCtrl &m_TreeCtrl = GetTreeCtrl();
m_TreeCtrl.DeleteItem(hSelected);
}
void CLeftView::DeleteSubItem(CString strItemText)
{
CTreeCtrl &m_TreeCtrl = GetTreeCtrl();
HTREEITEM hSelected = m_TreeCtrl.GetSelectedItem();
HTREEITEM hCurrent = m_TreeCtrl.GetChildItem(hSelected);
HTREEITEM hNext;
CString pszText;
while(hCurrent)
{
pszText = m_TreeCtrl.GetItemText(hCurrent);
if(pszText == strItemText)
{
m_TreeCtrl.DeleteItem(hCurrent);
break;
}
hNext = m_TreeCtrl.GetNextSiblingItem(hCurrent);
hCurrent = hNext;
}
}
void CLeftView::OnPopupDelete()
{
// TODO: Add your command handler code here
CTreeCtrl &m_TreeCtrl = GetTreeCtrl();
HTREEITEM hSelected=m_TreeCtrl.GetSelectedItem();
CString strPath = GetPathName();
DeleteTreeNode(hSelected); // 删除树结点
RemoveDirectory(strPath); // 删除目录
}
void CLeftView::OnPopupProperty()
{
// TODO: Add your command handler code here
CTreeCtrl &m_TreeCtrl = GetTreeCtrl();
HTREEITEM hSelected=m_TreeCtrl.GetSelectedItem();
CString strPath = GetPathName();
CString strName = m_TreeCtrl.GetItemText(hSelected);
CString strLocation = strPath.Left(strPath.ReverseFind('\\'));
int bAttribute[4];
CString strAttribute[3];
GetAttribute(strPath, bAttribute, strAttribute);
CDlgAttribute dlg;
dlg.m_strName = strName;
dlg.m_strType = "文件夹";
dlg.m_strLocation = strLocation;
dlg.m_bReadOnly = bAttribute[0];
dlg.m_bHide = bAttribute[1];
dlg.m_bArchive = bAttribute[2];
dlg.m_bSystem = bAttribute[3];
dlg.m_strCreatetime = strAttribute[0];
dlg.m_strSize = strAttribute[1];
dlg.m_strFileNumber = strAttribute[2];
dlg.DoModal();
}
void CLeftView::OnPopupRename()
{
// TODO: Add your command handler code here
CTreeCtrl &m_TreeCtrl = GetTreeCtrl();
HTREEITEM hSelected=m_TreeCtrl.GetSelectedItem();
CString strPath = GetPathName();
CString strname = m_TreeCtrl.GetItemText(hSelected);
CDldRename dlg;
dlg.m_OldName = strname;
dlg.m_NewName = strname;
if(dlg.DoModal()==IDOK)
{
CString strNewPath = strPath.Left(strPath.ReverseFind('\\') + 1);
strNewPath += dlg.m_NewName;
m_TreeCtrl.SetItemText(hSelected, dlg.m_NewName);
CopyDirectory(strNewPath, strPath);
RemoveDirectory(strPath);
}
}
void CLeftView::OnUpdatePopupRename(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
CTreeCtrl &m_TreeCtrl = GetTreeCtrl();
HTREEITEM hSelected = m_TreeCtrl.GetSelectedItem();
HTREEITEM hParent = m_TreeCtrl.GetParentItem(hSelected);
if(hParent == NULL)
pCmdUI->Enable(false);
else
pCmdUI->Enable(true);
}
void CLeftView::OnUpdatePopupProperty(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
CTreeCtrl &m_TreeCtrl = GetTreeCtrl();
HTREEITEM hSelected = m_TreeCtrl.GetSelectedItem();
HTREEITEM hParent = m_TreeCtrl.GetParentItem(hSelected);
if(hParent == NULL)
pCmdUI->Enable(false);
else
pCmdUI->Enable(true);
}
void CLeftView::OnUpdatePopupDelete(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
CTreeCtrl &m_TreeCtrl = GetTreeCtrl();
HTREEITEM hSelected = m_TreeCtrl.GetSelectedItem();
HTREEITEM hParent = m_TreeCtrl.GetParentItem(hSelected);
if(hParent == NULL)
pCmdUI->Enable(false);
else
pCmdUI->Enable(true);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -