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

📄 leftview.cpp

📁 Transfer Files to and from an FTP Server
💻 CPP
字号:
// LeftView.cpp : implementation of the CLeftView class
//

#include "stdafx.h"
#include "FTP.h"

#include "FTPDoc.h"
#include "LeftView.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

TV_ITEM TvI;
TV_INSERTSTRUCT TvIns;
HTREEITEM hPrev=0, hParent;
char TmpStr[MAX_PATH];
CTreeCtrl *TreeCtrl;
extern CListCtrl *ListCtrl;
extern char *Months[], *Days[];
extern CFtpConnection* m_pFtpConnection;
extern CStatic TimeElapse;
//extern CStatusBar  m_wndStatusBar;
extern HTREEITEM ghTitem;
extern DWORD FTP2Local;

/////////////////////////////////////////////////////////////////////////////
// CLeftView

IMPLEMENT_DYNCREATE(CLeftView, CTreeView)

BEGIN_MESSAGE_MAP(CLeftView, CTreeView)
	//{{AFX_MSG_MAP(CLeftView)
	ON_NOTIFY_REFLECT(TVN_ITEMEXPANDING, OnItemexpanding)
	ON_NOTIFY_REFLECT(TVN_SELCHANGED, OnSelchanged)
	//}}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_HASBUTTONS | TVS_LINESATROOT | TVS_HASLINES | TVS_SHOWSELALWAYS | TVS_DISABLEDRAGDROP |
                                  WS_VISIBLE | WS_CHILD | WS_BORDER;

	return CTreeView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CLeftView drawing

void CLeftView::OnDraw(CDC* pDC)
{
	CFTPDoc* 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()
{
	UINT Ret;
	CTreeView::OnInitialUpdate();

	CTreeCtrl &ab=GetTreeCtrl();
	TreeCtrl = &ab;
//	TimeElapse.SetWindowText("Elapsed");
	char DriveRoot[] = "A:\\", Drive[]="A:";
	for(int i=0; i<26; i++){
		DriveRoot[0] = Drive[0] = 'A'+i;
		Ret=GetDriveType(DriveRoot);
		if((Ret != DRIVE_UNKNOWN) && (Ret != DRIVE_NO_ROOT_DIR)){
//			wsprintf(TmpStr, "Computer Users");
			TvI.mask = TVIF_CHILDREN | TVIF_TEXT | TVIF_PARAM ; //| TVIF_IMAGE | TVIF_SELECTEDIMAGE;
			TvI.pszText = Drive;
			TvI.cChildren = 1;
			TvI.lParam = 0; //(LPARAM)TreeCtrl->GetRootItem();
//			TvI.iImage = 0;
//			TvI.iSelectedImage = 0;
			TvIns.item = TvI;
			TvIns.hParent = TVI_ROOT;
			TvIns.hInsertAfter = TVI_LAST;
			hPrev = TreeCtrl->InsertItem((LPTVINSERTSTRUCT) &TvIns);
			hParent = hPrev;
		}
	}
	// TODO: You may populate your TreeView with items by directly accessing
	//  its tree control through a call to GetTreeCtrl().
}

/////////////////////////////////////////////////////////////////////////////
// CLeftView diagnostics

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

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

CFTPDoc* CLeftView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CFTPDoc)));
	return (CFTPDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CLeftView message handlers

void CLeftView::OnItemexpanding(NMHDR* pNMHDR, LRESULT* pResult) 
{
	NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
	// TODO: Add your control notification handler code here
	if(pNMTreeView->itemNew.state & TVIS_EXPANDEDONCE)	
		return;
	CString Dir, SubDir, cstr;
	HTREEITEM hTC = pNMTreeView->itemNew.hItem;
	if(pNMTreeView->itemNew.lParam == 0){
		CFileFind Cf;
		Dir = TreeCtrl->GetItemText(hTC);
		while (true)
		{
			hTC = TreeCtrl->GetParentItem(hTC);
			if(!hTC)
				break;

			if (hTC != TreeCtrl->GetRootItem())
				Dir = TreeCtrl->GetItemText(hTC)+"\\"+Dir;
		}
		Dir += "\\*.*";
		BOOL Ret = Cf.FindFile(Dir, 0);
		while(Ret){
			Ret = Cf.FindNextFile();
			SubDir = Cf.GetFileName();
			if(Cf.IsDots() || !Cf.IsDirectory())
				continue;
			TvI.mask = TVIF_CHILDREN | TVIF_TEXT | TVIF_PARAM;
			TvI.pszText = (LPTSTR)(LPCTSTR) SubDir;
			TvI.cChildren = 1;
			TvI.lParam = (LPARAM) 0;
			TvIns.item = TvI;
			TvIns.hParent = (HTREEITEM) pNMTreeView->itemNew.hItem;
			TvIns.hInsertAfter = TVI_SORT;
			hPrev = TreeCtrl->InsertItem((LPTVINSERTSTRUCT) &TvIns);
		}
		Cf.Close();
	}
	else if(pNMTreeView->itemNew.lParam == 1){
		CFtpFileFind Cf(m_pFtpConnection);
		Dir = TreeCtrl->GetItemText(hTC);
		CString Tmp;
		while (true)
		{
			hTC = TreeCtrl->GetParentItem(hTC);
			if(!hTC)
				break;
		
			if (hTC != TreeCtrl->GetRootItem()){
				Tmp = TreeCtrl->GetItemText(hTC);
				if(strcmp(Tmp, "/") == 0)
					break;
				Dir = Tmp+"/"+Dir;
			}
		}
		Dir += "/*";
		BOOL Ret = Cf.FindFile(Dir, 0);
		while(Ret){
			Ret = Cf.FindNextFile();
			SubDir = Cf.GetFileName();
			if(Cf.IsDots() || !Cf.IsDirectory())
				continue;
			TvI.mask = TVIF_CHILDREN | TVIF_TEXT | TVIF_PARAM;
			TvI.pszText = (LPTSTR)(LPCTSTR) SubDir;
			TvI.cChildren = 1;
			TvI.lParam = (LPARAM) 1;
			TvIns.item = TvI;
			TvIns.hParent = (HTREEITEM) pNMTreeView->itemNew.hItem;
			TvIns.hInsertAfter = TVI_SORT;
			hPrev = TreeCtrl->InsertItem((LPTVINSERTSTRUCT) &TvIns);
		}
		Cf.Close();
	}
	
	*pResult = 0;
}

void CLeftView::OnSelchanged(NMHDR* pNMHDR, LRESULT* pResult) 
{
	NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
	// TODO: Add your control notification handler code here
	
	CString Dir, SubDir, cstr;
	HTREEITEM hTC = pNMTreeView->itemNew.hItem;
	ghTitem = hTC;
	if(pNMTreeView->itemNew.lParam == 0){
		FTP2Local=0;
		CFileFind Cf;
		Dir = TreeCtrl->GetItemText(hTC);
		while (true)
		{
			hTC = TreeCtrl->GetParentItem(hTC);
			if(!hTC)
				break;

			if (hTC != TreeCtrl->GetRootItem())
				Dir = TreeCtrl->GetItemText(hTC)+"\\"+Dir;
		}
		Dir += "\\*.*";
		ListCtrl->DeleteAllItems();
		BOOL Ret = Cf.FindFile(Dir, 0);
		while(Ret){
			Ret = Cf.FindNextFile();
			SubDir = Cf.GetFileName();
			if(Cf.IsDots())
				continue;
	//		lvI.mask = LVIF_TEXT ; //| LVIF_IMAGE |LVIF_PARAM;
	//		lvI.iItem = 0;
	//		lvI.iSubItem = 0;
	//		lvI.pszText = (LPSTR)(LPCSTR) SubDir;
	//		lvI.cchTextMax = strlen((LPSTR)(LPCSTR) SubDir);
			if(ListCtrl->InsertItem(0, (LPSTR)(LPCSTR) SubDir) == -1)
				return;
	//		lvI.iImage = 0;  //sfi.iIcon;
	//		lvI.lParam = (LPARAM) ((int)&(laFile[gdNumFiles]) - (int) laFile);

			//Creation Time Calculation
			char TmpStr1[5], szText[MAX_PATH];
			FILETIME FT;
			SYSTEMTIME ST;
			Cf.GetLastWriteTime(&FT);
			FileTimeToSystemTime(&FT, &ST);
			strcpy(TmpStr1, "am");
			if(ST.wHour >= 12){
				strcpy(TmpStr1, "pm");
				ST.wHour -= 12;
			}
			ST.wHour = ST.wHour == 0 ? 12: ST.wHour;
			wsprintf(szText, "%2d %s %d %s %2d:%02d:%02d%s", ST.wDay, Months[ST.wMonth-1], 
				ST.wYear, Days[ST.wDayOfWeek], ST.wHour, ST.wMinute, 
				ST.wSecond, TmpStr1);
			ListCtrl->SetItemText(0, 4, szText);
			//File Type Calculation
			SHFILEINFO psfi;
//			SHGetFileInfo((LPSTR)(LPCSTR) Cf.GetFilePath(), 0, &psfi, sizeof(SHFILEINFO), SHGFI_TYPENAME);
			SHGetFileInfo(SubDir, FILE_ATTRIBUTE_NORMAL, &psfi, sizeof(SHFILEINFO), SHGFI_USEFILEATTRIBUTES | SHGFI_TYPENAME);
			ListCtrl->SetItemText(0, 3, psfi.szTypeName);
			//File Size Calculation
			DWORD TmpVal;
			TmpVal = Cf.GetLength();
			wsprintf(szText, "%lu", TmpVal);
			ListCtrl->SetItemText(0, 1, szText);
		}
		Cf.Close();
	}
	else if(pNMTreeView->itemNew.lParam == 1){
		FTP2Local=1;
		CFtpFileFind CFtp(m_pFtpConnection);
		CString Tmp;
		Dir = TreeCtrl->GetItemText(hTC);
		while (true)
		{
			hTC = TreeCtrl->GetParentItem(hTC);
			if(!hTC)
				break;
		
			if (hTC != TreeCtrl->GetRootItem()){
				Tmp = TreeCtrl->GetItemText(hTC);
				if(strcmp(Tmp, "/") == 0){
					Dir = Tmp+Dir;
					break;
				}
				Dir = Tmp+"/"+Dir;
			}
		}
		Dir += "/*";
		ListCtrl->DeleteAllItems();
		BOOL Ret = CFtp.FindFile(Dir, 0);
		while(Ret){
			Ret = CFtp.FindNextFile();
			SubDir = CFtp.GetFileName();
			if(CFtp.IsDots())
				continue;
	//		lvI.mask = LVIF_TEXT ; //| LVIF_IMAGE |LVIF_PARAM;
	//		lvI.iItem = 0;
	//		lvI.iSubItem = 0;
	//		lvI.pszText = (LPSTR)(LPCSTR) SubDir;
	//		lvI.cchTextMax = strlen((LPSTR)(LPCSTR) SubDir);
			if(ListCtrl->InsertItem(0, (LPSTR)(LPCSTR) SubDir) == -1)
				return;
	//		lvI.iImage = 0;  //sfi.iIcon;
	//		lvI.lParam = (LPARAM) ((int)&(laFile[gdNumFiles]) - (int) laFile);

			//Creation Time Calculation
			char TmpStr1[5], szText[MAX_PATH];
			FILETIME FT;
			SYSTEMTIME ST;
			CFtp.GetLastWriteTime(&FT);
			FileTimeToSystemTime(&FT, &ST);
			strcpy(TmpStr1, "am");
			if(ST.wHour >= 12){
				strcpy(TmpStr1, "pm");
				ST.wHour -= 12;
			}
			ST.wHour = ST.wHour == 0 ? 12: ST.wHour;
			wsprintf(szText, "%2d %s %d %s %2d:%02d:%02d%s", ST.wDay, Months[ST.wMonth-1], 
				ST.wYear, Days[ST.wDayOfWeek], ST.wHour, ST.wMinute, 
				ST.wSecond, TmpStr1);
			ListCtrl->SetItemText(0, 4, szText);
			//File Type Calculation
			SHFILEINFO psfi;
			SHGetFileInfo(SubDir, FILE_ATTRIBUTE_NORMAL, &psfi, sizeof(SHFILEINFO), SHGFI_USEFILEATTRIBUTES | SHGFI_TYPENAME);
			ListCtrl->SetItemText(0, 3, psfi.szTypeName);
			//File Size Calculation
			DWORD TmpVal;
			TmpVal = CFtp.GetLength();
			wsprintf(szText, "%lu", TmpVal);
			ListCtrl->SetItemText(0, 1, szText);
		}
		CFtp.Close();
	}
	*pResult = 0;
}

⌨️ 快捷键说明

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