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

📄 treeview2.cpp

📁 PocketPC上很好用的文件管理器,而且里面的封装性很好,学windows mobile开发的兄弟,值得一看
💻 CPP
📖 第 1 页 / 共 3 页
字号:
///////////////////////////////////////////////////////////////
//TreeView.cpp
//僼僅儖僟堦棗傪昞帵

///////////////////////////////////////////////////////////////
#include "GSFinder.h"
#include "TreeView2.h"
///////////////////////////////////////////////////////////////
#define ID_TREEVIEW			1

//ADD START TODA
WNDPROC	Org_TreeViewProc = NULL;
///////////////////////////////////////////////////////////////
LRESULT CALLBACK TreeViewProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	switch (message) 
	{
		//僉乕墴壓
		case WM_KEYDOWN:
			//HOME僉乕墴壓
			if(wParam == VK_HOME)
			{
				g_MainWnd.m_ListView.OnGoBack();
				return 0;
			}
			//END僉乕墴壓
			if(wParam == VK_END)
			{
				g_MainWnd.m_ListView.OnGoFront();
				return 0;
			}
			break;
		//僞僢僾奐巒帪
		case WM_LBUTTONDOWN:
			g_MainWnd.m_TreeView.OnTapHoldBegin((DWORD)lParam);
			break;
#ifndef __POCKET_PC
		//僞僢僾廔椆帪
		case WM_LBUTTONUP:
			g_MainWnd.m_TreeView.OnTapHoldCancel();
			break;
#endif
		//僞僢僾&儂乕儖僪帪(僞僀儉傾僂僩帪)
		case WM_TIMER:
			if(wParam == ID_TIMER_MENUCANCEL)
			{
				//g_MainWnd.m_TreeView.OnSelectMenuLoop();
				//g_MainWnd.m_TreeView.OnSelectMenuLoop();
			}
			else if(wParam == ID_TIMER_TAPHOLD)
				g_MainWnd.m_TreeView.OnTapHoldEnter();
			break;
		//偦傟埲奜
		default:
			break;
	}
	return CallWindowProc((WNDPROC)Org_TreeViewProc, hWnd, message, wParam, lParam);
}
//ADD END

///////////////////////////////////////////////////////////////
CTreeView::CTreeView()
{
	m_hImageList = NULL;
	m_bEditing = FALSE;
	m_hRootItem = NULL;
	m_bLoadReq = TRUE;
	m_bTimer = FALSE;
	m_bTaping = FALSE;	//ADD TODA
	m_bHolding = FALSE;	//ADD TODA
}
///////////////////////////////////////////////////////////////
CTreeView::~CTreeView()
{
}
///////////////////////////////////////////////////////////////
void CTreeView::Init(HWND hwndParent)
{
	DWORD dwStyle = WS_TABSTOP | WS_VISIBLE | WS_CHILD | TVS_EDITLABELS |
					TVS_HASBUTTONS | TVS_HASLINES | TVS_SHOWSELALWAYS;
	DWORD dwExStyle = WS_EX_CLIENTEDGE;

#ifdef __POCKET_PC			//ADD START TODA (from Y.Nagamidori)
	dwStyle |= WS_BORDER;
	dwExStyle = 0;
#endif						//ADD END

	m_hWnd = CreateWindowEx(dwExStyle,
							WC_TREEVIEW,
							NULL, dwStyle, 0, 0, 0, 0,
							hwndParent, (HMENU)ID_TREEVIEW,
							g_hInst, NULL);

	//ADD START TODA (僞僢僾&儂乕儖僪梡)
	Org_TreeViewProc = (WNDPROC)GetWindowLong(m_hWnd, GWL_WNDPROC);
	SetWindowLong(m_hWnd, GWL_WNDPROC, (DWORD)TreeViewProc);

	//ADD END
	InitImageList();
	LoadFolderTree();	//MOD TODA (僐儊儞僩偺夝彍)

//DEL START TODA (張棟堦杮壔偺堊)
//	TreeView_DeleteAllItems(m_hWnd);
//
//	TVINSERTSTRUCT tvis;
//	tvis.hParent = NULL;
//	tvis.hInsertAfter = TVI_SORT;
//	tvis.item.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_CHILDREN;
//	tvis.item.pszText = (LPTSTR)GetRootName();
//	tvis.item.iImage = 0;
//	tvis.item.iSelectedImage = 0;
//	tvis.item.cChildren = 1;
//	HTREEITEM hRoot = TreeView_InsertItem(m_hWnd, &tvis);
//	m_hRootItem = hRoot;
//	TreeView_Expand(m_hWnd, hRoot, TVE_EXPAND);
//DEL END
}

///////////////////////////////////////////////////////////////
void CTreeView::Destroy()
{
	ImageList_Destroy(m_hImageList);
	DestroyWindow(m_hWnd);
}

//ADD START TODA
///////////////////////////////////////////////////////////////
void CTreeView::TreeExpand(HWND hTree, HTREEITEM hItem, BOOL bDelete)
{
	if(bDelete)
	{
		//僣儕乕偺巕僲乕僪傪慡偰嶍彍
		HTREEITEM hChild = TreeView_GetChild(hTree, hItem);
		while(hChild) {
			HTREEITEM hNext = TreeView_GetNextItem(hTree, hChild, TVGN_NEXT);
			TreeView_DeleteItem(hTree, hChild);
			hChild = hNext;
		}
	}

	//巕僲乕僪偺嵞庢摼
	TCHAR szKey[MAX_PATH];
	//1.僼僅儖僟柤傪庢摼
	GetTree(hItem, szKey);
	//2.巕僣儕乕傪楍嫇偡傞
	EnumChildren(hItem, szKey);
}
//ADD END

///////////////////////////////////////////////////////////////
void CTreeView::LoadChildFolder(HTREEITEM hParent, LPCTSTR szPath)
{
	WIN32_FIND_DATA finddata;
	TCHAR szTemp[MAX_PATH];
	HTREEITEM hTreeItem;
	wsprintf(szTemp, _T("%s\\*.*"), szPath);

	HANDLE hFind = FindFirstFile(szTemp, &finddata);
	if (hFind != INVALID_HANDLE_VALUE)
	{
		BOOL bRet = TRUE;
		do
		{
			if (finddata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
			{
				TVINSERTSTRUCT tvis;
				tvis.hParent = hParent;
				tvis.hInsertAfter = TVI_SORT;
				tvis.item.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE;
				tvis.item.pszText = finddata.cFileName;
				tvis.item.iImage = 1;
				tvis.item.iSelectedImage = 1;
				hTreeItem = TreeView_InsertItem(m_hWnd, &tvis);
				wsprintf(szTemp, _T("%s\\%s"), szPath, finddata.cFileName);
				LoadChildFolder(hTreeItem, szTemp);
			}
		}
		while (FindNextFile(hFind, &finddata));
		FindClose(hFind);
	}

	TreeView_SortChildren(m_hWnd, hParent, 0);
}

///////////////////////////////////////////////////////////////
//MOD TODA (僷儔儊乕僞捛壛)
void CTreeView::SetCurrentFolder(LPCTSTR lpszPath, BOOL bUpdate, BOOL bSelect)
{
//DEL START TODA (旕昞帵偵偟側偄曽偑憗偄?亄偪傜偮偒杊巭) 
//	//僣儕乕價儏乕傪旕昞帵
//	HWND hwndPrev = GetFocus();
//	ShowWindow(m_hWnd, SW_HIDE);
//DEL END
	m_bLoadReq = FALSE;

	//専嶕僨傿儗僋僩儕巜掕偺応崌
	if(0 == wcscmp(SEARCH_FOLDER_NAME, lpszPath))
	{
		//儖乕僩傪揥奐
		TreeView_Expand(m_hWnd, m_hRootItem, TVE_EXPAND);

		//傾僀僥儉慖戰
		TreeView_SelectItem(m_hWnd, m_hSearchItem);
		m_bLoadReq = TRUE;
		return;
	}

	KillTimer(NULL, ID_TIMER_TVSELECTED);
	LPCTSTR lpszStart = wcschr(lpszPath, _T('\\'));

	//専嶕奐巒僲乕僪傪儖乕僩偵愝掕
	HTREEITEM hSelectItem = m_hRootItem;
	HTREEITEM hParent = m_hRootItem;

	//儖乕僩傪揥奐
	TreeView_Expand(m_hWnd, hParent, TVE_EXPAND);

	//専嶕傾僀僥儉偑側偔側傞傑偱孞傝曉偟
	while (lpszStart)
	{
		//僨傿儗僋僩儕柤拪弌
		TCHAR szName[MAX_PATH] = _T("");
		LPCTSTR lpszEnd = wcschr(lpszStart + 1, _T('\\'));
		if (lpszEnd) {
			int len = lpszEnd - (lpszStart + 1);
			wcsncpy(szName, ++lpszStart, len);
			szName[len] = 0;
		}
		else
			wcscpy(szName, ++lpszStart);

		//巕僲乕僪庢摼
		HTREEITEM hChild = TreeView_GetChild(m_hWnd, hParent);
		while (hChild)
		{
			//巕僲乕僪偺傾僀僥儉庢摼
			TCHAR szChildName[MAX_PATH] = _T("");
			TVITEM tvi;
			tvi.mask = TVIF_TEXT | TVIF_HANDLE;
			tvi.pszText = szChildName;
			tvi.cchTextMax = MAX_PATH;
			tvi.hItem = hChild;
			TreeView_GetItem(m_hWnd, &tvi);
			
			//懳徾偺僨傿儗僋僩儕偺応崌
			if (wcscmp(szName, szChildName) == 0)
			{
				hSelectItem = hParent = hChild;
				lpszStart = wcschr(lpszStart, _T('\\'));
				if (lpszStart) {
					//巕僲乕僪傪揥奐
					TreeView_Expand(m_hWnd, hParent, TVE_EXPAND);
				}
				break;
			}

			hChild = TreeView_GetNextItem(m_hWnd, hChild, TVGN_NEXT);
		
		} //End of while

		if(!hChild) break;

	} //End of while

	//ADD START TODA (僲乕僪傪峏怴偡傞張棟傪捛壛)
	if(bUpdate)
	{
		//僲乕僪偺忬懺傪庢摼
		TVITEM tvi;
		tvi.mask = TVIF_CHILDREN | TVIF_STATE | TVIF_HANDLE;
		tvi.hItem = hParent;
		tvi.cChildren = 0;
		TreeView_GetItem(m_hWnd, &tvi);

		//峏怴慜偺巕僲乕僪傪庢摼
		HTREEITEM hChild = TreeView_GetChild(m_hWnd, hParent);

		//愭摢僲乕僪傪峏怴(嶌惉偟側偍偡)
		TreeExpand(m_hWnd, hParent);

		//峏怴慜偵巕僲乕僪偑偁傝丄僲乕僪偑揥奐偟偰偄偨応崌
		if(hChild && tvi.state & TVIS_EXPANDED)
			//僲乕僪傪奐偔
			TreeView_Expand(m_hWnd, hParent, TVE_EXPAND);
		else
			//僲乕僪傪暵偠傞
			TreeView_Expand(m_hWnd, hParent, TVE_COLLAPSE);
	}
	//ADD END

	//傾僀僥儉傪慖戰
	if(bSelect)			//ADD TODA
		TreeView_SelectItem(m_hWnd, hSelectItem);

	m_bLoadReq = TRUE;

//DEL START TODA (旕昞帵偵偟側偄曽偑憗偄?亄偪傜偮偒杊巭) 
//	//僣儕乕價儏乕傪昞帵
//	ShowWindow(m_hWnd, SW_SHOW);
//	SetFocus(hwndPrev);
//DEL END
}

///////////////////////////////////////////////////////////////
void CTreeView::LoadFolderTree()
{
	m_bLoadReq = FALSE;

//	HCURSOR hCursor = SetCursor(LoadCursor(NULL, IDC_WAIT));
	HWND hwndPrev = GetFocus();
	ShowWindow(m_hWnd, SW_HIDE);
	
	TreeView_DeleteAllItems(m_hWnd);

	TVINSERTSTRUCT tvis;
	tvis.hParent = NULL;
	tvis.hInsertAfter = TVI_SORT;
	tvis.item.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_CHILDREN;
	tvis.item.pszText = (LPTSTR)GetRootName();
	tvis.item.iImage = 0;
	tvis.item.iSelectedImage = 0;
	tvis.item.cChildren = 1;
	HTREEITEM hRoot = TreeView_InsertItem(m_hWnd, &tvis);
//	LoadChildFolder(hRoot, _T(""));
	m_hRootItem = hRoot;
	TreeView_Expand(m_hWnd, hRoot, TVE_EXPAND);

//	m_hRootItem = hRoot;

//	SetCursor(hCursor);

	//ADD TODA (専嶕寢壥僼僅儖僟嶌惉)
	LoadSeachFolderRoot();

	m_bLoadReq = TRUE;

	ShowWindow(m_hWnd, SW_SHOW);
	SetFocus(hwndPrev);
}

//ADD START TODA
///////////////////////////////////////////////////////////////
void CTreeView::LoadSeachFolderRoot()
{
	TVINSERTSTRUCT tvis;
	tvis.hParent = NULL;
	tvis.hInsertAfter = TVI_LAST;
	tvis.item.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_CHILDREN;
	tvis.item.pszText = SEARCH_FOLDER_NAME;
	tvis.item.iImage = 7;
	tvis.item.iSelectedImage = 7;
	tvis.item.cChildren = 0;
	m_hSearchItem = TreeView_InsertItem(m_hWnd, &tvis);
}
//ADD END

///////////////////////////////////////////////////////////////
void CTreeView::InitImageList()
{
	m_bLoadReq = FALSE;
	TreeView_DeleteAllItems(m_hWnd);
	TreeView_SetImageList(m_hWnd, NULL, TVSIL_NORMAL);
	ImageList_Destroy(m_hImageList);

	//ImageList嶌惉
	m_hImageList = ImageList_Create(16, 16, ILC_COLOR|ILC_MASK, 1, 2);
	AddRootIcon(m_hImageList);
	HICON hIcon = (HICON)LoadImage(g_hInst, (LPCTSTR)IDI_FOLDER_S, IMAGE_ICON, 16, 16, 0);
	ImageList_AddIcon(m_hImageList, hIcon);
	DestroyIcon(hIcon);
	hIcon = (HICON)LoadImage(g_hInst, (LPCTSTR)IDI_FOLDERO_S, IMAGE_ICON, 16, 16, 0);
	ImageList_AddIcon(m_hImageList, hIcon);
	DestroyIcon(hIcon);
	hIcon = (HICON)LoadImage(g_hInst, (LPCTSTR)IDI_TEMP_S, IMAGE_ICON, 16, 16, 0);
	ImageList_AddIcon(m_hImageList, hIcon);
	DestroyIcon(hIcon);
	hIcon = (HICON)LoadImage(g_hInst, (LPCTSTR)IDI_MYDOCUMENTS_S, IMAGE_ICON, 16, 16, 0);
	ImageList_AddIcon(m_hImageList, hIcon);
	DestroyIcon(hIcon);
	//ADD START TODA
	//僗僞乕僩儊僯儏乕
	hIcon = (HICON)LoadImage(g_hInst, (LPCTSTR)IDI_START_S, IMAGE_ICON, 16, 16, 0);
	ImageList_AddIcon(m_hImageList, hIcon);
	DestroyIcon(hIcon);
	//僱僢僩儚乕僋傾僀僐儞
	hIcon = (HICON)LoadImage(g_hInst, (LPCTSTR)IDI_NETFOLDER_S, IMAGE_ICON, 16, 16, 0);
	ImageList_AddIcon(m_hImageList, hIcon);
	DestroyIcon(hIcon);
	//専嶕傾僀僐儞
	hIcon = (HICON)LoadImage(g_hInst, (LPCTSTR)IDI_SEARCH_S, IMAGE_ICON, 16, 16, 0);
	ImageList_AddIcon(m_hImageList, hIcon);
	DestroyIcon(hIcon);
	//ADD END

	TreeView_SetImageList(m_hWnd, m_hImageList, TVSIL_NORMAL);
	m_bLoadReq = TRUE;
}

///////////////////////////////////////////////////////////////
void CTreeView::SetCurrentFolder()
{
	TCHAR szPath[MAX_PATH] = _T("");
	TCHAR szTemp[MAX_PATH] = _T("");
	TCHAR szName[MAX_PATH] = _T("");
	
	HTREEITEM hTreeItem = TreeView_GetSelection(m_hWnd);
	TVITEM tvi;
	tvi.mask = TVIF_TEXT | TVIF_HANDLE;
	tvi.pszText = szName;
	tvi.cchTextMax = MAX_PATH;
	tvi.hItem = hTreeItem;
	TreeView_GetItem(m_hWnd, &tvi);
	if (wcscmp(szName, GetRootName()) != 0)
	{
		wcscpy(szPath, szName);
		hTreeItem = TreeView_GetParent(m_hWnd, hTreeItem);
		while (hTreeItem)
		{
			tvi.hItem = hTreeItem;
			TreeView_GetItem(m_hWnd, &tvi);
			if (wcscmp(szName, GetRootName()) != 0)
				wsprintf(szTemp, _T("%s\\%s"), szName, szPath);
			else
				wsprintf(szTemp, _T("\\%s"), szPath);
			wcscpy(szPath, szTemp);
			hTreeItem = TreeView_GetParent(m_hWnd, hTreeItem);
		}
		
		wcscpy(szTemp, szPath);
	}
	else
	{
		wcscpy(szTemp, _T(""));
	}
	
	g_MainWnd.m_ListView.LoadFolderItem(szTemp, FALSE);
}

//ADD START TODA
////////////////////////////////////////////////////////////////
void CTreeView::GetCurrentFolder(LPTSTR lpszPath)
{
	TCHAR szPath[MAX_PATH] = _T("");
	TCHAR szTemp[MAX_PATH] = _T("");
	TCHAR szName[MAX_PATH] = _T("");
	
	HTREEITEM hTreeItem = TreeView_GetSelection(m_hWnd);
	TVITEM tvi;
	tvi.mask = TVIF_TEXT | TVIF_HANDLE;
	tvi.pszText = szName;
	tvi.cchTextMax = MAX_PATH;
	tvi.hItem = hTreeItem;
	TreeView_GetItem(m_hWnd, &tvi);
	if (wcscmp(szName, GetRootName()) != 0)
	{
		wcscpy(szPath, szName);
		hTreeItem = TreeView_GetParent(m_hWnd, hTreeItem);
		while (hTreeItem)
		{
			tvi.hItem = hTreeItem;
			TreeView_GetItem(m_hWnd, &tvi);
			if (wcscmp(szName, GetRootName()) != 0)
				wsprintf(szTemp, _T("%s\\%s"), szName, szPath);
			else
				wsprintf(szTemp, _T("\\%s"), szPath);
			wcscpy(szPath, szTemp);
			hTreeItem = TreeView_GetParent(m_hWnd, hTreeItem);
		}
		
		wcscpy(szTemp, szPath);
	}
	else
	{
//		wcscpy(szTemp, _T(""));
		szTemp[0] = 0x00;
	}
	
	wcscpy(m_szCurrentFolder, szTemp);
	if(lpszPath) wcscpy(lpszPath, szTemp);
}
////////////////////////////////////////////////////////////////
DWORD CTreeView::OnKeyDown(LPNMTVKEYDOWN lpnkd)
{
	if (m_bEditing) return 0;

	if(g_bDraging)
	{
		if(lpnkd->wVKey == VK_ESCAPE) {
			g_MainWnd.OnDropCansel();
			g_bDraging = FALSE;
		}
		return 0;
	}

	//僔儑乕僩僇僢僩僉乕僥乕僽儖
	if ((lpnkd->wVKey == 'M' && (GET_KEYSTATE(VK_CONTROL)&0x8000)) ||
		(lpnkd->wVKey == VK_CONTROL && (GET_KEYSTATE(VK_MENU)&0x8000)))
	{
		HTREEITEM hItem = TreeView_GetSelection(m_hWnd);
		if(hItem)
		{
			RECT rc;
			TreeView_GetItemRect(m_hWnd, hItem, &rc, TRUE);
			OnRClick(rc.left + (rc.right - rc.left) / 2, rc.top + (rc.bottom - rc.top) / 2);
		}
		else

⌨️ 快捷键说明

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