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

📄 leftview.cpp

📁 我要下载源代码我要源代码我要下载代码我要下载源代码
💻 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 + -