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

📄 listview.cpp

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

///////////////////////////////////////////////////////////////
void CListView::AddUpper()
{
	// 堦偮忋偺僼僅儖僟傊傪捛壛
	LISTITEMCOMP *plic = new LISTITEMCOMP;
	memset(plic, 0, sizeof(LISTITEMCOMP));
	plic->nItem = LIST_ITEM_UPPER;

	int nLen = wcslen(IDS_UPPER) + 1;
	plic->lpszName = new TCHAR[nLen];
	*plic->lpszName = 0;
	wcscpy(plic->lpszName, IDS_UPPER);

	LVITEM li;
	li.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM;
	li.iItem = 0;
	li.iSubItem = 0;
	li.iImage = I_IMAGECALLBACK;
	li.lParam = (DWORD)plic;
	li.pszText = IDS_UPPER;
	ListView_InsertItem(m_hWnd, &li);
	m_dwUpperParam = li.lParam;
}

//ADD START TODA (AddFolderItem()傛傝張棟堏摦)
///////////////////////////////////////////////////////////////
void CListView::AddFolderItemSub(LPCTSTR lpszPath, LPCTSTR lpszName, DWORD dwAttr, FILETIME ft, DWORD dwSize, UINT* lpAllSize, BOOL bSelect)
{
	if (FILE_ATTRIBUTE_DIRECTORY == (dwAttr & FILE_ATTRIBUTE_DIRECTORY))
	{
		//塀偟僼傽僀儖僠僃僢僋
		if ((dwAttr & FILE_ATTRIBUTE_HIDDEN) && m_Settings.bHideHidden)
			return;

		// 偛傒敔僠僃僢僋
		if (wcsicmp(lpszName, _T("Recycled")) == 0)
			return;

		//僼僅儖僟
		LISTITEMCOMP *plic = new LISTITEMCOMP;
		plic->nItem = LIST_ITEM_FOLDER;
		int nLen = wcslen(lpszName) + 1;
		plic->lpszName = new TCHAR[nLen];
		*plic->lpszName = NULL;
		wcscpy(plic->lpszName, lpszName);
		//ADD START TODA
		nLen = wcslen(lpszPath) + 1;
		plic->lpszPath = new TCHAR[nLen];
		*plic->lpszPath = NULL;
		wcscpy(plic->lpszPath, lpszPath);
		//ADD END

		plic->dwSize = 0;
		plic->ft = ft;
		plic->dwAttr = dwAttr;
		LVITEM li;
		li.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM;
		li.iItem = 0;
		li.iSubItem = 0;
		li.iImage = I_IMAGECALLBACK;
		li.lParam = (DWORD)plic;
		li.pszText = LPSTR_TEXTCALLBACK;
		int nItem = ListView_InsertItem(m_hWnd, &li);
		if(bSelect) {
			ListView_SetItemState(m_hWnd, nItem, LVIS_SELECTED, LVIS_SELECTED);
			ListView_SetItemState(m_hWnd, nItem, LVIS_FOCUSED, LVIS_FOCUSED);
		}

		ListView_SetItemText(m_hWnd, 0, 2, LPSTR_TEXTCALLBACK);
	}
	else if (FILE_ATTRIBUTE_DIRECTORY != (dwAttr & FILE_ATTRIBUTE_DIRECTORY))
	{
		//塀偟僼傽僀儖僠僃僢僋
		if ((dwAttr & FILE_ATTRIBUTE_HIDDEN) && m_Settings.bHideHidden)
			return;

		//僔僗僥儉僼傽僀儖僠僃僢僋
		if ((dwAttr & FILE_ATTRIBUTE_SYSTEM) && m_Settings.bHideSystem)
			return;

		//ROM僠僃僢僋
		if ((dwAttr & FILE_ATTRIBUTE_INROM) && m_Settings.bHideROM)
			return;

		// 僼傽僀儖
		LISTITEMCOMP *plic = new LISTITEMCOMP;
		plic->nItem = LIST_ITEM_FILE;
		int nLen = wcslen(lpszName) + 1;
		plic->lpszName = new TCHAR[nLen];
		*plic->lpszName = NULL;
		wcscpy(plic->lpszName, lpszName);
		//ADD START TODA
		nLen = wcslen(lpszPath) + 1;
		plic->lpszPath = new TCHAR[nLen];
		*plic->lpszPath = NULL;
		wcscpy(plic->lpszPath, lpszPath);
		//ADD END
		
		plic->dwSize = dwSize;
		plic->ft = ft;
		plic->dwAttr = dwAttr;
		FileTimeToLocalFileTime(&plic->ft, &plic->ft);
		LVITEM li;
		li.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM;
		li.iItem = 0;
		li.iSubItem = 0;
		li.iImage = I_IMAGECALLBACK;
		li.lParam = (DWORD)plic;
		li.pszText = LPSTR_TEXTCALLBACK;
		int nItem = ListView_InsertItem(m_hWnd, &li);
		if(bSelect) {
			ListView_SetItemState(m_hWnd, nItem, LVIS_SELECTED, LVIS_SELECTED);
			ListView_SetItemState(m_hWnd, nItem, LVIS_FOCUSED, LVIS_FOCUSED);
		}
		ListView_SetItemText(m_hWnd, 0, 1, LPSTR_TEXTCALLBACK);
		ListView_SetItemText(m_hWnd, 0, 2, LPSTR_TEXTCALLBACK);
		ListView_SetItemText(m_hWnd, 0, 3, LPSTR_TEXTCALLBACK);
		*lpAllSize += plic->dwSize;
	}
}
//ADD END

///////////////////////////////////////////////////////////////
void CListView::AddFolderItem(WIN32_FIND_DATA *finddata, LPCTSTR lpszPath, UINT* lpAllSize, BOOL bSelect)
{
	//MDD START TODA (AddFolderItemSub()偺屇傃弌偟偵曄峏)
	if(finddata->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
	{
		AddFolderItemSub(lpszPath,
						 finddata->cFileName,
						 finddata->dwFileAttributes,
						 finddata->ftCreationTime,
						 0,
						 lpAllSize,
						 bSelect);
	}
	else
	{
		AddFolderItemSub(lpszPath,
						 finddata->cFileName,
						 finddata->dwFileAttributes,
						 finddata->ftLastWriteTime,
						 finddata->nFileSizeLow,
						 lpAllSize,
						 bSelect);
	}
	//MDD END
}
//ADD START TODA (僼傽僀儖僆乕僾儞張棟嫟捠壔)
///////////////////////////////////////////////////////////////
void CListView::ComFileOpen(LPCTSTR lpszPath)
{
	//奼挘巕偺傒傪僐僺乕
	LPTSTR lpszExt = wcsrchr(lpszPath, _T('.'));

	//嵟廔揑偵僆乕僾儞偡傞僷僗
	LPTSTR lpszOpen = (LPTSTR)lpszPath;
	LPTSTR lpszParam = NULL;			//ADD TODA
	
	//奼挘巕僠僃僢僋
	if (wcsicmp(lpszExt, _T(".LNK"))==0)
	{
		//儕儞僋僼傽僀儖偲擣幆
		TCHAR szPath[MAX_PATH];
		if (SHGetShortcutTarget(lpszPath, szPath, MAX_PATH))
		{
			LPTSTR lpszStart = szPath;
			if(lpszStart[0] == _T('\"'))
			{
				LPTSTR lpszEnd = wcschr(++lpszStart, _T('\"'));
				if(lpszEnd)
				{
					*lpszEnd=0x00;
					if(*(++lpszEnd)) lpszParam=lpszEnd;
				}
			}
			else
			{
				LPTSTR lpszEnd = wcschr(lpszStart, _T(' '));
				if(lpszEnd)
				{
					*lpszEnd=0x00;
					if(*(++lpszEnd)) lpszParam=lpszEnd;
				}
			}
			
			//僷儔儊乕僞抣敾掕(嬻敀嶍彍)
			while(lpszParam)
			{
				if(!(*lpszParam))
					break;

				if(*lpszParam == _T(' '))
					lpszParam++;
				else
					break;

			} //End of while

			HCURSOR hCursor = SetCursor(LoadCursor(NULL, IDC_WAIT));	//ADD TODA (from GSFinder ver.1.99)
			DWORD dwAttr = GetFileAttributes(lpszStart);
			SetCursor(hCursor);											//ADD TODA (from GSFinder ver.1.99)
			//僨傿儗僋僩儕偺応崌
			if (FILE_ATTRIBUTE_DIRECTORY == (dwAttr & FILE_ATTRIBUTE_DIRECTORY) && dwAttr != 0xFFFFFFFF)
			{
				LoadFolderItem(lpszStart);
				return;
			}
			
			//僷僗傪庢摼偟偨儕儞僋愭偵愝掕
			lpszOpen = lpszStart;
			
			//奼挘巕偺傒傪嵞僐僺乕
			LPTSTR lpszExt = wcsrchr(lpszStart, _T('.'));
		}
	}

	//埑弅僼傽僀儖偐傪敾掕
	if((m_Settings.bDblClick) &&
	   ((g_MainWnd.m_Compress.IsCompress(COMPDLL_MODE_LHA) && wcsicmp(lpszExt, _T(".LZH"))==0) ||
	    (g_MainWnd.m_Compress.IsCompress(COMPDLL_MODE_ZIP) && wcsicmp(lpszExt, _T(".ZIP"))==0)))
	{
		//僼傽僀儖夝搥偺幚峴
		OnFileUnCompress();
		return;
	}
	
	//奐偔
	SHELLEXECUTEINFO sei;
	sei.cbSize = sizeof(SHELLEXECUTEINFO);
	sei.fMask = 0;
	sei.hwnd = g_MainWnd.m_hWnd;
	sei.lpVerb = _T("open");
	sei.lpFile = lpszOpen;
	sei.lpParameters = lpszParam;
	sei.lpDirectory = NULL;
	sei.nShow = SW_SHOW;
	sei.hInstApp = g_hInst;
	ShellExecuteEx(&sei);
}
//ADD END
///////////////////////////////////////////////////////////////
//昞帵宍幃偺曄峏
void CListView::OnChangeListStyle(UINT nCmdID)
{
//	ShowWindow(m_hWnd, SW_HIDE);	//DEL TODA
	//m_Settings.dwListExStyle = 0; //del by kawa
	//MOD START TODA (from GSFinder ver.1.99)
	DWORD dwStyle = 0;
	switch (nCmdID)
	{
		case ID_VIEW_LARGEICON:
			m_Settings.dwListExStyle = 0; //add by kawa
			m_Settings.dwListStyle = LVS_ICON;
			break;
		case ID_VIEW_SMALLICON:
			m_Settings.dwListExStyle = 0; //add by kawa
			m_Settings.dwListStyle = LVS_SMALLICON;
			break;
		case ID_VIEW_LIST:
			m_Settings.dwListExStyle = 0; //add by kawa
			m_Settings.dwListStyle = LVS_LIST;
			break;
		case ID_VIEW_REPORT:
			m_Settings.dwListExStyle = 0; //add by kawa
			m_Settings.dwListStyle = LVS_REPORT;
			break;
		//ADD START TODA
		case ID_VIEW_REPORTLINE:
			m_Settings.dwListExStyle = LVS_EX_FULLROWSELECT;
			m_Settings.dwListStyle = LVS_REPORT;
			break;
		default:
			//側偵傕偟側偄(愝掕偺傑傑)
			break;
		//ADD END
	}
	dwStyle = DEF_LIST_STYLE | m_Settings.dwListStyle;
	//MOD END
#ifdef __POCKET_PC
	if (m_Settings.dwListStyle == LVS_REPORT && m_Settings.bHideHeader)
		dwStyle |= LVS_NOCOLUMNHEADER;
#endif
	if ((m_Settings.dwListStyle&LVS_TYPEMASK)==LVS_ICON)
		m_pFileImageList = &m_FileImageListLarge;
	else
		m_pFileImageList = &m_FileImageListSmall;

	SetWindowLong(m_hWnd, GWL_STYLE, dwStyle);
	g_MainWnd.m_CmdBands.SetCheckListStyle(m_Settings.dwListStyle, m_Settings.dwListExStyle);	//MOD TODA

	//MOD START TODA (from GSFinder ver.1.99)
	if (m_Settings.dwListStyle == LVS_REPORT && m_Settings.dwListExStyle)
		ListView_SetExtendedListViewStyle(m_hWnd, ListView_GetExtendedListViewStyle(m_hWnd) | DEF_LIST_EXSTYLE|m_Settings.dwListExStyle);
	//MOD END
	else
		ListView_SetExtendedListViewStyle(m_hWnd, 0);

	if (m_Settings.dwListStyle == LVS_ICON)
		ListView_SetIconSpacing(m_hWnd, 72, 72);

	ListView_Arrange(m_hWnd, LVA_DEFAULT);
//	ShowWindow(m_hWnd, SW_SHOW);	//DEL TODA
//	UpdateWindow(m_hWnd);			//DEL TODA
//	SetFocus(m_hWnd);				//DEL TODA

	//夋柺峏怴
	InvalidateRect(g_MainWnd.m_hWnd, NULL, FALSE);
}
///////////////////////////////////////////////////////////////
//儕僗僩偺暲傋懼偊
void CListView::OnChangeSort(UINT nCmdID)
{
	switch (nCmdID)
	{
		case ID_VIEW_SORT_NAME: m_Settings.nSort = LIST_SORT_NAME; break;
		case ID_VIEW_SORT_EXT: m_Settings.nSort = LIST_SORT_EXT; break;
		case ID_VIEW_SORT_SIZE: m_Settings.nSort = LIST_SORT_SIZE; break;
		case ID_VIEW_SORT_TIME: m_Settings.nSort = LIST_SORT_TIME; break;
		case ID_VIEW_SORT_NOT_RAISE: m_Settings.bSortRaise = !m_Settings.bSortRaise; break;
	}

	SortList();
	
	g_MainWnd.m_CmdBands.SetCheckSort(m_Settings.nSort, m_Settings.bSortRaise);
}
///////////////////////////////////////////////////////////////
void CListView::OnViewUpdate(LPCTSTR lpszPath) //MOD TODA (僷儔儊乕僞捛壛)
{
	TCHAR szTemp[MAX_PATH];
	//MOD START TODA (僷僗巜掕帪偺張棟捛壛)
	if(lpszPath)
		wcscpy(szTemp, lpszPath);
	else
		GetWindowText(g_MainWnd.m_CmdBands.m_hComboBox, szTemp, MAX_PATH);
	//MOD END

	if (wcscmp(szTemp, GetRootName()) == 0 || wcscmp(szTemp, _T("\\")) == 0 ||
		wcscmp(szTemp, _T("\\\\")) == 0 || wcscmp(szTemp, _T("/")) == 0 || wcslen(szTemp) == 0)
		LoadFolderItem(_T(""));
	else
	{
		//ADD START TODA
		//壖憐僷僗偺応崌僠僃僢僋傪偟側偄
		if(0 == wcscmp(SEARCH_FOLDER_NAME, szTemp))
		{
			LoadFolderItem(szTemp);
			return;
		}
		//ADD END

		//懚嵼偡傞偐偺妋擣
		HCURSOR hCursor = SetCursor(LoadCursor(NULL, IDC_WAIT));	//ADD TODA (from GSFinder ver.1.99)
		DWORD dwAttr = GetFileAttributes(szTemp);
		SetCursor(hCursor);											//ADD TODA (from GSFinder ver.1.99)
		if (dwAttr != 0xFFFFFFFF)
		{
			if (FILE_ATTRIBUTE_DIRECTORY == (dwAttr & FILE_ATTRIBUTE_DIRECTORY))
				LoadFolderItem(szTemp);
			else
			{
				//ADD START TODA (僼傽僀儖僆乕僾儞嫟捠張棟屇傃弌偟) 
				ComFileOpen(szTemp);
				//ADD END

//DEL START TODA (僼傽僀儖僆乕僾儞嫟捠張棟屇傃弌偟偵曄峏)
//				//僼傽僀儖傪奐偔
//				SHELLEXECUTEINFO sei;
//				sei.cbSize = sizeof(SHELLEXECUTEINFO);
//				sei.fMask = 0;
//				sei.hwnd = g_MainWnd.m_hWnd;
//				sei.lpVerb = _T("open");
//				sei.lpFile = szTemp;
//				sei.lpParameters = NULL;
//				sei.lpDirectory = NULL;
//				sei.nShow = SW_SHOW;
//				sei.hInstApp = g_hInst;
//				ShellExecuteEx(&sei);
//DEL END
			}
		}
		else
			MessageBox(g_MainWnd.m_hWnd, IDS_MSG_NOTFOUND_PATH, NULL, MB_OK|MB_ICONSTOP);
	}
}
///////////////////////////////////////////////////////////////
void CListView::OnViewUpFolder()
{
//	TCHAR szPath[MAX_PATH] = _T("");	//DEL TODA (from GSFinder ver.1.99)
	if (wcscmp(m_szCurrentFolder, _T(""))!=0)
	{
		LPTSTR lpszTemp = wcsrchr(m_szCurrentFolder, _T('\\'));
		if (lpszTemp)
		{
			*lpszTemp = NULL;
			if (wcscmp(m_szCurrentFolder, _T("\\")) == 0)
				*m_szCurrentFolder = NULL;
			LoadFolderItem(m_szCurrentFolder);
		}
		else
			LoadFolderItem(_T(""));
	}
}

///////////////////////////////////////////////////////////////
void CListView::OnFileOpen()
{
	int nIndex = GetSelectedItemIndex(0);
	OnFileOpen(nIndex);
}
///////////////////////////////////////////////////////////////
void CListView::OnFileOpen(int nIndex)
{
	if (nIndex != -1)
	{
		LISTITEMCOMP *plic = GetListItemStruct(nIndex);
		if (plic->nItem == LIST_ITEM_FOLDER)
		{
			//僼僅儖僟傪奐偔
			TCHAR szPath[MAX_PATH];
			//MOD START TODA
//			wsprintf(szPath, _T("%s\\%s"), m_szCurrentFolder, plic->lpszName);
			wsprintf(szPath, _T("%s\\%s"), plic->lpszPath, plic->lpszName);
			//MOD END
			LoadFolderItem(szPath);
		}
		else if (plic->nItem == LIST_ITEM_FILE)
		{
			//僼傽僀儖傪奐偔
			TCHAR szPath[MAX_PATH];

			//MOD START TODA (僼傽僀儖僆乕僾儞嫟捠張棟屇傃弌偟)
			wsprintf(szPath, _T("%s\\%s"), plic->lpszPath, plic->lpszName);
			ComFileOpen(szPath);
			//MOD END
		}
		else if (plic->nItem == LIST_ITEM_UPPER)
			OnViewUpFolder();
	}
}

///////////////////////////////////////////////////////////////
void CListView::OnItemChanged()				//MOD TODA (堷悢嶍彍)
{
	g_MainWnd.m_CmdBands.SetEnableItemSelected();
}

///////////////////////////////////////////////////////////////
void CListView::OnFileCreateFolder()
{
	int nCount = 1;

⌨️ 快捷键说明

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