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

📄 listview.cpp

📁 PocketPC上很好用的文件管理器,而且里面的封装性很好,学windows mobile开发的兄弟,值得一看
💻 CPP
📖 第 1 页 / 共 5 页
字号:
			}
		}
		if(pup) delete pup;

		//m_szCurrentFolder
		dwType = REG_SZ;
		dwDataSize = sizeof(bString);
		if (RegQueryValueEx(hKey, _T("LastFolder"), 0, &dwType, bString, &dwDataSize) == ERROR_SUCCESS)
			memcpy(&m_szCurrentFolder, bString, dwDataSize);
		
		//m_szCompressFolder
		dwType = REG_SZ;
		dwDataSize = sizeof(bString);
		if (RegQueryValueEx(hKey, _T("CompressFolder"), 0, &dwType, bString, &dwDataSize) == ERROR_SUCCESS)
			memcpy(&m_szCompressFolder, bString, dwDataSize);

		//m_bTimeStump
		dwType = REG_BINARY;
		lpData = new BYTE[sizeof(m_bTimeStump)];
		dwDataSize = sizeof(m_bTimeStump);
		if (RegQueryValueEx(hKey, _T("TimeStump"), 0, &dwType, lpData, &dwDataSize) == ERROR_SUCCESS)
			memcpy(&m_bTimeStump, lpData, dwDataSize);
		delete[] lpData;

		//m_bHideFolder
		dwType = REG_BINARY;
		lpData = new BYTE[sizeof(m_bHideFolder)];
		dwDataSize = sizeof(m_bHideFolder);
		if (RegQueryValueEx(hKey, _T("HideFolder"), 0, &dwType, lpData, &dwDataSize) == ERROR_SUCCESS)
			memcpy(&m_bHideFolder, lpData, dwDataSize);
		delete[] lpData;

		//m_bNoExtShortcut
		dwType = REG_BINARY;
		lpData = new BYTE[sizeof(m_bNoExtShortcut)];
		dwDataSize = sizeof(m_bNoExtShortcut);
		if (RegQueryValueEx(hKey, _T("NoExtShortcut"), 0, &dwType, lpData, &dwDataSize) == ERROR_SUCCESS)
			memcpy(&m_bNoExtShortcut, lpData, dwDataSize);
		delete[] lpData;

		RegCloseKey(hKey);
	}
}
///////////////////////////////////////////////////////////////
void CListView::SaveSettings()
{
	//曐懚慜偵僇儔儉僒僀僘傪庢摼
	if (m_Settings.dwListStyle==LVS_REPORT)
	{
		m_Settings.nNameColumnSize = ListView_GetColumnWidth(m_hWnd, 0);
		m_Settings.nSizeColumnSize = ListView_GetColumnWidth(m_hWnd, 1);
		m_Settings.nTypeColumnSize = ListView_GetColumnWidth(m_hWnd, 2);
		m_Settings.nTimeColumnSize = ListView_GetColumnWidth(m_hWnd, 3);
	}

	HKEY hKey = 0;
	DWORD dwDisposition;

	if (RegCreateKeyEx(HKEY_CURRENT_USER, REG_KEY_SETTINGS, 0,
		_T(""), REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, &dwDisposition)==ERROR_SUCCESS)
	{
		//m_Settings
		RegSetValueEx(hKey, _T("ListView"), 0, REG_BINARY,
				(LPBYTE)&m_Settings, sizeof(m_Settings));

		//m_ImageListSettings
		RegSetValueEx(hKey, _T("FileImageList"), 0, REG_BINARY,
				(LPBYTE)&m_ImageListSettings, sizeof(m_ImageListSettings));

		//m_nOpenPthInfoCount
		RegSetValueEx(hKey, _T("OpenPthInfoCount"), 0, REG_BINARY,
				(LPBYTE)&m_nOpenPthInfoCount, sizeof(m_nOpenPthInfoCount));

		for(int i=0; i<m_nOpenPthInfoCount; i++)
		{
			OPENAPPINFO* poa= m_lpOpenPthInfo[i];
			TCHAR szKey[16];
			wsprintf(szKey, _T("OpenPthInfo%d"), i);
			RegSetValueEx(hKey, szKey, 0, REG_SZ,
					(LPBYTE)poa->lpszPath, ((wcslen(poa->lpszPath)+1)  * sizeof(TCHAR)));
		} //End of for

		//m_szCurrentFolder[MAX_PATH];
		RegSetValueEx(hKey, _T("LastFolder"), 0, REG_SZ,
				(LPBYTE)m_szCurrentFolder, ((wcslen(m_szCurrentFolder)+1) * sizeof(TCHAR)));

		//m_szCompressFolder[MAX_PATH];
		RegSetValueEx(hKey, _T("CompressFolder"), 0, REG_SZ,
				(LPBYTE)m_szCompressFolder, ((wcslen(m_szCompressFolder)+1) * sizeof(TCHAR)));

		//m_bTimeStump
		RegSetValueEx(hKey, _T("TimeStump"), 0, REG_BINARY,
				(LPBYTE)&m_bTimeStump, sizeof(m_bTimeStump));

		//m_bHideFolder
		RegSetValueEx(hKey, _T("HideFolder"), 0, REG_BINARY,
				(LPBYTE)&m_bHideFolder, sizeof(m_bHideFolder));

		//m_bNoExtShortcut
		RegSetValueEx(hKey, _T("NoExtShortcut"), 0, REG_BINARY,
				(LPBYTE)&m_bNoExtShortcut, sizeof(m_bNoExtShortcut));

		RegCloseKey(hKey);
	}
}

//ADD START TODA
///////////////////////////////////////////////////////////////
void CListView::MainWindowReset(LPCTSTR lpszPath, int nAllSize)
{
	TCHAR szTemp[MAX_PATH];

	//僇儗儞僩僼僅儖僟峏怴
	wcscpy(m_szCurrentFolder, lpszPath);

	//傾僪儗僗僶乕傊僷僗愝掕
	g_MainWnd.m_CmdBands.SetFolderName(lpszPath);
	
	//傾僀僥儉悢丄僒僀僘傪昞帵
	if (g_MainWnd.m_CmdBands.m_Settings.bShowAddressBar)
	{
		//傾僪儗僗僶乕昞帵帪
		TCHAR szItemCount[64];
		TCHAR szAllSize[64];
		wsprintf(szTemp, _T("%d"), (m_dwUpperParam && wcslen(lpszPath) && wcsicmp(SEARCH_FOLDER_NAME,lpszPath)!=0) ?
			ListView_GetItemCount(m_hWnd) - 1 : ListView_GetItemCount(m_hWnd));

		SetFormatInteger(szTemp, 64);
		wsprintf(szItemCount, IDS_FMT_OBJECTSCOUNT, szTemp);
		wsprintf(szTemp, _T("%d"), nAllSize);
		SetFormatInteger(szTemp, 64);
		wsprintf(szAllSize, IDS_FMT_TOTALBYTES, szTemp);
		g_MainWnd.m_StatusWnd.SetTwoPaneText(szItemCount, szAllSize);
	}
	else
	{
		//傾僪儗僗僶乕旕昞帵帪
		TCHAR szItemCount[64];
		TCHAR szAllSize[64];
		TCHAR szFolder[64];
		wsprintf(szTemp, _T("%d"), (m_dwUpperParam && wcslen(lpszPath) && wcsicmp(SEARCH_FOLDER_NAME,lpszPath)!=0) ?
			ListView_GetItemCount(m_hWnd) - 1 : ListView_GetItemCount(m_hWnd));

		SetFormatInteger(szTemp, 64);
		wsprintf(szItemCount, IDS_FMT_OBJECTSCOUNT_S, szTemp);
		SetFormatSize(nAllSize, szAllSize, IDS_FMT_TOTALBYTES_SKB, IDS_FMT_TOTALBYTES_SMB);
		LPTSTR lpszFolderName = wcsrchr(m_szCurrentFolder, _T('\\'));
		if (lpszFolderName)
			wcscpy(szFolder, ++lpszFolderName);
		else
			wcscpy(szFolder, GetRootName());

		g_MainWnd.m_StatusWnd.SetThreePaneText(szFolder, szItemCount, szAllSize);
	}

	//MOD START TODA (from GSFinder ver.1.99)
	//堦偮忋偺僼僅儖僟傊傪桳岠丒柍岠
	g_MainWnd.m_CmdBands.SetEnableUpperFolder(wcslen(lpszPath) ? TRUE : FALSE);

	//恑傓儃僞儞桳岠/柍岠
	g_MainWnd.m_CmdBands.SetEnableFront(m_lpHistoryCurrent->lpNext ? TRUE : FALSE);
	
	//栠傞儃僞儞桳岠/柍岠
	g_MainWnd.m_CmdBands.SetEnableBack(m_lpHistoryCurrent->lpPrev ? TRUE : FALSE);
	//MOD END
}

///////////////////////////////////////////////////////////////
void CListView::LoadFolderReset(LPCTSTR lpszPath)
{
	//傾僀僥儉悢丄僒僀僘偺僇僂儞僩
	UINT nAllSize = 0;

	//僼傽僀儖偺撉傒崬傒
	TCHAR szTemp[MAX_PATH];
	wsprintf(szTemp, _T("%s\\*.*"), lpszPath);
	WIN32_FIND_DATA finddata;
	HANDLE hFind = FindFirstFile(szTemp, &finddata);
	if (hFind != INVALID_HANDLE_VALUE)
	{
		do
		{
			//傾僀僥儉偑僼傽僀儖偺応崌偺傒
			if(FILE_ATTRIBUTE_DIRECTORY !=
			  (finddata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
				//僒僀僘傪僇僂儞僩
				nAllSize += finddata.nFileSizeLow;
		}
		while (FindNextFile(hFind, &finddata));
		FindClose(hFind);
	}
	
	//夋柺嵞峔抸
	MainWindowReset(lpszPath, nAllSize);
	m_nFileSize = nAllSize;
}
///////////////////////////////////////////////////////////////
void CListView::LoadFolderSearch(LPCTSTR lpszPath)
{
	//僇乕僜儖傪張棟拞偵偡傞
	HCURSOR hCursor = SetCursor(LoadCursor(NULL, IDC_WAIT));

	//僗僥乕僞僗僶乕昞帵(張棟拞昞帵)
	TCHAR szTemp[MAX_PATH];
	wsprintf(szTemp, IDS_FMT_LOADING);
	g_MainWnd.m_StatusWnd.SetSimpleText(szTemp);
	
	//傾僀僥儉悢丄僒僀僘偺僇僂儞僩
	UINT nAllSize = 0;

	//傾僀僥儉偺嶍彍
	DeleteAllItem();

	//埲崀偺傾僪儗僗傪嶍彍
	SEARCHDATA *pCurrent = m_lpSearchData;
	while(pCurrent)
	{
		SEARCHDATA *pNext = pCurrent->lpNext;
		
		TCHAR szTemp[MAX_PATH];
		wsprintf(szTemp, _T("%s\\%s"), pCurrent->lpszPath, pCurrent->lpszName);
		if (GetFileAttributes(szTemp) == 0xFFFFFFFF)
		{
			//儕僗僩偺楢寢
			if(pCurrent->lpPrev) {
				pCurrent->lpPrev->lpNext = pNext;
			} else {
				m_lpSearchData = pNext;
			}
			if(pCurrent->lpNext) {
				pCurrent->lpNext->lpPrev = pCurrent->lpPrev;
			}
			//傾僀僥儉偺嶍彍
			pCurrent->lpNext = NULL;
			DeleteSearch(pCurrent);
		}
		else
		{
			//傾僀僥儉偺捛壛
			AddFolderItemSub(pCurrent->lpszPath,
							 pCurrent->lpszName,
							 pCurrent->dwAttr,
							 pCurrent->ft,
							 pCurrent->dwSize,
							 &nAllSize,
							 FALSE);
		}

		//師偺儊儞僶
		pCurrent = pNext;

	} //End of while

	// 僜乕僩
	if (ListView_GetItemCount(m_hWnd))
		SortList();

	//夋柺嵞峔抸
	MainWindowReset(lpszPath, nAllSize);
	m_nFileSize = nAllSize;

	//僇乕僜儖傪尦偵栠偡
	SetCursor(hCursor);

	//僣儕乕價儏乕峏怴
	g_MainWnd.m_TreeView.SetCurrentFolder(lpszPath, FALSE, TRUE);

	//傾僀僥儉慖戰
	ListView_SetItemState(m_hWnd, 0, LVIS_SELECTED, LVIS_SELECTED);
	ListView_SetItemState(m_hWnd, 0, LVIS_FOCUSED, LVIS_FOCUSED);
}

///////////////////////////////////////////////////////////////
void CListView::LoadFolderFiles(LPCTSTR lpszPath, BOOL bTVUpdate)
{
	//僇乕僜儖傪張棟拞偵偡傞
	HCURSOR hCursor = SetCursor(LoadCursor(NULL, IDC_WAIT));

	//僗僥乕僞僗僶乕昞帵(張棟拞昞帵)
	TCHAR szTemp[MAX_PATH];
	wsprintf(szTemp, IDS_FMT_LOADING);
	g_MainWnd.m_StatusWnd.SetSimpleText(szTemp);

	//棜楌捛壛
	m_lpHistoryCurrent = AddHistory(m_lpHistoryCurrent, lpszPath);
	if(!m_lpHistory)
		m_lpHistory = m_lpHistoryCurrent;

	//傾僀僥儉悢丄僒僀僘偺僇僂儞僩
	UINT nAllSize = 0;

	//傾僀僥儉偺嶍彍
	DeleteAllItem();

	// 堦偮忋偺僼僅儖僟傊傪捛壛
	if (wcslen(lpszPath) && m_Settings.bAddUpper)
		AddUpper();
	else
		m_dwUpperParam = NULL;

	//慜夞偺僼僅儖僟傪敾掕
	LPTSTR lpszUpprFolder = NULL;
	if(wcslen(m_szOldFolder)!=0) {
		if(lpszUpprFolder=wcsrchr(m_szOldFolder, _T('\\'))) {
			if(wcsncmp(lpszPath, m_szOldFolder, (lpszUpprFolder-m_szOldFolder))==0) {
				lpszUpprFolder++;
			} else {
				lpszUpprFolder=NULL;
			}
		}
	}

	//僼傽僀儖偺撉傒崬傒
	BOOL bSelect=FALSE;
	wsprintf(szTemp, _T("%s\\*.*"), lpszPath);
	WIN32_FIND_DATA finddata;
	HANDLE hFind = FindFirstFile(szTemp, &finddata);
	if (hFind != INVALID_HANDLE_VALUE)
	{
		do
		{
			//僼僅儖僟旕昞帵偺応崌僼僅儖僟傪柍帇
			if(m_bHideFolder &&
			   FILE_ATTRIBUTE_DIRECTORY == 
			   (finddata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
				continue;

			//傾僀僥儉慖戰
			BOOL bItemSelect=FALSE;
			if(lpszUpprFolder) {
				if(wcscmp(lpszUpprFolder, finddata.cFileName) == 0)
					bSelect=bItemSelect=TRUE;
			}

			//傾僀僥儉捛壛
			AddFolderItem(&finddata, lpszPath, &nAllSize, bItemSelect);
		}
		while (FindNextFile(hFind, &finddata));
		FindClose(hFind);
	}
	
	// 僜乕僩
	if (ListView_GetItemCount(m_hWnd))
		SortList();

	//夋柺嵞峔抸
	MainWindowReset(lpszPath, nAllSize);
	m_nFileSize = nAllSize;

	//僇乕僜儖傪尦偵栠偡
	SetCursor(hCursor);

	//僣儕乕價儏乕峏怴
	g_MainWnd.m_TreeView.SetCurrentFolder(lpszPath, bTVUpdate);

	if(bSelect) {
		//慖戰傾僀僥儉傪僗僋儘乕儖
		ListView_EnsureVisible(m_hWnd, GetSelectedItemIndex(0), FALSE);
	} else {
		//愭摢傾僀僥儉傪慖戰
		ListView_SetItemState(m_hWnd, 0, LVIS_SELECTED, LVIS_SELECTED);
		ListView_SetItemState(m_hWnd, 0, LVIS_FOCUSED, LVIS_FOCUSED);
	}

	//慜夞僷僗偲偟偰僷僗傪曐懚
	wcscpy(m_szOldFolder, lpszPath);
}

///////////////////////////////////////////////////////////////
void CListView::LoadFolderItem(LPCTSTR lpszPath, BOOL bTVUpdate)
{
	//ADD START TODA (僼傽僀儖曄峏捠抦 from Y.Nagamidori)
	//峏怴捠抦晄梫
	DisableUpdateNotify();
	//ADD END

	//嵞昤夋掆巭
	SendMessage(m_hWnd, WM_SETREDRAW, (WPARAM)0, (LPARAM)0);

	//専嶕張棟偺応崌
	if(0 == wcscmp(lpszPath, SEARCH_FOLDER_NAME))
		LoadFolderSearch(lpszPath);
	else
		LoadFolderFiles(lpszPath, bTVUpdate);

	//嵞昤夋奐巒
	SendMessage(m_hWnd, WM_SETREDRAW, (WPARAM)1, (LPARAM)0);

	//ADD START TODA (僼傽僀儖曄峏捠抦 from Y.Nagamidori)
	SetUpdateNotify(lpszPath);
	EnableUpdateNotify();
	//ADD END
}

///////////////////////////////////////////////////////////////
void CListView::LoadFolderItemSub(LPCTSTR lpszPath)
{
	//嵞昤夋掆巭
	SendMessage(m_hWnd, WM_SETREDRAW, (WPARAM)0, (LPARAM)0);

	//傾僀僥儉嶍彍
	DeleteAllItem();

	// 堦偮忋偺僼僅儖僟傊傪愝掕偟側偄
	m_dwUpperParam = NULL;

	//傾僀僥儉悢丄僒僀僘偺僇僂儞僩梡
	UINT nAllSize = 0;

	//僼傽僀儖偺撉傒崬傒
	WIN32_FIND_DATA finddata;
	HANDLE hFind = FindFirstFile(lpszPath, &finddata);
	if (hFind != INVALID_HANDLE_VALUE)
	{
		//僷僗偲僨傿儗僋僩儕傪暘棧
		TCHAR szPath[MAX_PATH];
		wcscpy(szPath, lpszPath);
		LPTSTR lpszTemp = wcsrchr(szPath, _T('\\'));
		*lpszTemp = 0x00;

		//傾僀僥儉傪捛壛
		AddFolderItem(&finddata, szPath, &nAllSize);

		//僴儞僪儖傪僋儘乕僘
		FindClose(hFind);
	}
	
	//僇儗儞僩僼僅儖僟傪愝掕
	wcscpy(m_szCurrentFolder, lpszPath);

	//嵞昤夋奐巒
	SendMessage(m_hWnd, WM_SETREDRAW, (WPARAM)1, (LPARAM)0);
}

///////////////////////////////////////////////////////////////
void CListView::SelectFile(LPCTSTR lpszPath)
{
	//ADD START TODA (儖乕僩帪偺僷僗愝掕 - advice by Y.Nagamidori)
	//儖乕僩僨傿儗僋僩儕偺応崌
	if(wcslen(lpszPath) == 0 || wcscmp(lpszPath, GetRootName()) == 0)
		wcscpy(m_szCurrentFolder, _T(""));
	//ADD END
	else
	{
		//僨傿儗僋僩儕傊堏摦
		LoadFolderItemSub(lpszPath);
	
		//慡偰偺傾僀僥儉傪慖戰忬懺偲偡傞
		ListView_SetItemState(m_hWnd, -1, LVIS_SELECTED, LVIS_SELECTED);
	}
}
//ADD END

⌨️ 快捷键说明

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