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

📄 listview.cpp

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

///////////////////////////////////////////////////////////////
#include "GSFinder.h"
#include "ListView.h"
#ifdef __POCKET_PC
#include "CommandBandsPPC.h"
#include "FolderDlgPPC.h"
#else
#include "CommandBands.h"
#include "FolderDlg.h"
#endif
#include "FileProperty.h"
#include "CopyDlg.h"
#include "DeleteDlg.h"
#include "UserPathDlg.h"	//ADD TODA
#include "FileSearch.h"		//ADD TODA
#include "Association.h"	//ADD TODA
///////////////////////////////////////////////////////////////
#define ID_LISTVIEW			0

//ADD START TODA (from GSFinder ver.1.99)
#ifdef __POCKET_PC
#	define DEF_LIST_STYLE	(WS_BORDER | WS_TABSTOP | WS_VISIBLE | WS_CHILD | \
							LVS_SHAREIMAGELISTS | \
							LVS_ALIGNTOP | LVS_EDITLABELS | \
							LVS_SHOWSELALWAYS)
//#	define DEF_LIST_EXSTYLE	(LVS_EX_ONECLICKACTIVATE | LVS_EX_FULLROWSELECT)
#	define DEF_LIST_EXSTYLE	(LVS_EX_ONECLICKACTIVATE)
#else
#	define DEF_LIST_STYLE	(WS_TABSTOP | WS_VISIBLE | WS_CHILD | \
							LVS_SHAREIMAGELISTS | \
							LVS_ALIGNTOP | LVS_EDITLABELS | \
							LVS_SHOWSELALWAYS)
//#	define DEF_LIST_EXSTYLE	(LVS_EX_FULLROWSELECT)
#	define DEF_LIST_EXSTYLE	(0)
#endif
//ADD END

//ADD START TODA
WNDPROC	Org_ListViewProc = NULL;
///////////////////////////////////////////////////////////////
LRESULT CALLBACK ListViewProc(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_ListView.OnTapHoldBegin((DWORD)lParam);
			break;
#ifndef __POCKET_PC
		//僞僢僾廔椆帪
		case WM_LBUTTONUP:
			g_MainWnd.m_ListView.OnTapHoldCancel();
			break;
#endif
		//僞僢僾&儂乕儖僪帪(僞僀儉傾僂僩帪)
		case WM_TIMER:
		{
			if(wParam == ID_TIMER_MENUCANCEL)
			{
				g_MainWnd.m_ListView.OnSelectMenuLoop();
				g_MainWnd.m_ListView.OnSelectMenuLoop();
			}
			else if(wParam == ID_TIMER_TAPHOLD)
				g_MainWnd.m_ListView.OnTapHoldEnter();
			break;
		}
		//偦傟埲奜
		default:
			break;
	}
	return CallWindowProc((WNDPROC)Org_ListViewProc, hWnd, message, wParam, lParam);
}
//ADD END

////////////////////////////////////////////////////////////////
LRESULT CALLBACK FileOpenParamDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
	switch (message)
	{
		case WM_INITDIALOG:
		{
#ifdef __POCKET_PC
			SHINITDLGINFO shidi;
			shidi.dwMask = SHIDIM_FLAGS;
			shidi.dwFlags = SHIDIF_DONEBUTTON | SHIDIF_SIZEDLGFULLSCREEN;
			shidi.hDlg = hDlg;
			SHInitDialog(&shidi);
#else
			CenterWindow(hDlg);
#endif
			int nIndex = g_MainWnd.m_ListView.GetSelectedItemIndex(0);
			LISTITEMCOMP* plic = g_MainWnd.m_ListView.GetListItemStruct(nIndex);
			TCHAR szTemp[MAX_PATH];
			wsprintf(szTemp, IDS_FMT_OPENPARAM, plic->lpszName);
			SetWindowText(GetDlgItem(hDlg, IDC_MESSAGE), szTemp);
			return TRUE;
		}
		case WM_COMMAND:
			if (LOWORD(wParam) == IDOK)
			{
				int nIndex = g_MainWnd.m_ListView.GetSelectedItemIndex(0);
				LISTITEMCOMP* plic = g_MainWnd.m_ListView.GetListItemStruct(nIndex);

				TCHAR szParam[MAX_PATH];
				GetWindowText(GetDlgItem(hDlg, IDC_EDIT_PATH), szParam, 512);
				TCHAR szPath[MAX_PATH];
				wsprintf(szPath, _T("%s\\%s"), g_MainWnd.m_ListView.m_szCurrentFolder, plic->lpszName);

				SHELLEXECUTEINFO sei;
				sei.cbSize = sizeof(SHELLEXECUTEINFO);
				sei.fMask = 0;
				sei.hwnd = hDlg;
				sei.lpVerb = _T("open");
				sei.lpFile = szPath;
				sei.lpParameters = szParam;
				sei.lpDirectory = _T("");
				sei.nShow = SW_SHOW;
				sei.hInstApp = g_hInst;
				ShellExecuteEx(&sei);

				EndDialog(hDlg, LOWORD(wParam));
				return TRUE;
			}
			else if (LOWORD(wParam) == IDCANCEL)
			{
				EndDialog(hDlg, LOWORD(wParam));
				return TRUE;
			}
			break;
#ifdef __POCKET_PC
		case WM_PAINT:
			return DefDlgPaintProc(hDlg, wParam, lParam);
		case WM_CTLCOLORSTATIC:
			return DefDlgCtlColorStaticProc(hDlg, wParam, lParam);
#endif
	}
	return FALSE;
}

///////////////////////////////////////////////////////////////
CListView::CListView()
{
	m_Settings.nSort = LIST_SORT_NAME;
	m_Settings.bSortRaise = TRUE;
#ifdef __POCKET_PC
	m_Settings.dwListStyle = LVS_ICON;
#else
	m_Settings.dwListStyle = LVS_REPORT;
#endif
	m_Settings.dwListExStyle = 0;				//ADD END

	m_Settings.bHideHidden = TRUE;
	m_Settings.bHideSystem = FALSE;
	m_Settings.bHideROM = FALSE;

	m_Settings.nNameColumnSize = 145;
	m_Settings.nSizeColumnSize = 75;
	m_Settings.nTypeColumnSize = 75;
	m_Settings.nTimeColumnSize = 75;

	m_Settings.bSaveFolder = FALSE;
	wcscpy(m_szCurrentFolder, _T(""));
	m_Settings.bNotShortcutName = FALSE;
	m_Settings.bNotShowExt = TRUE;
#ifdef __POCKET_PC
	m_Settings.bSingleClick = TRUE;
	m_Settings.bAddUpper = TRUE;
#else
	m_Settings.bSingleClick = FALSE;
	m_Settings.bAddUpper = FALSE;
#endif
	//ADD START TODA
	m_Settings.bHideHeader = FALSE;
	m_Settings.nCompDLL = COMPDLL_MODE_ZIP;
	m_Settings.bAutoUnComp = FALSE;
	m_Settings.bMakeDir = FALSE;
	m_Settings.bMoveDir = FALSE;
	m_Settings.bDblClick = FALSE;
	wcscpy(m_szCompressFolder, _T("\\Temp"));
	wcscpy(m_szOldFolder, _T(""));
	m_bTimeStump = FALSE;
	m_bHideFolder = FALSE;
	m_bNoExtShortcut = TRUE;

	m_bTaping = FALSE;
	m_bHolding = FALSE;
	m_bMenu = FALSE;
	m_lpHistory = NULL;
	m_lpHistoryCurrent = NULL;
	m_lpSearchData = NULL;
	m_lpFavorites = NULL;
	m_lpFavoritesCurrent = NULL;
	m_nFavoritesCount = 0;
	//ADD END

	m_nCount = 0;
	m_bFileMove = FALSE;
	m_lpliinfo = NULL;
	wcscpy(m_szFolderFrom, _T(""));
	m_nFileSize = 0;
	m_hMenuPopup = NULL;
	m_pFileImageList = NULL;
	m_bEditing = FALSE;
	m_dwUpperParam = NULL;
	m_nOpenPthInfoCount = 0;	//ADD TODA

	m_ImageListSettings.bNotLoadFileIcon = FALSE;
	m_ImageListSettings.bNotLoadROMIcon = TRUE;
	m_ImageListSettings.bNotLoadCompIcon = TRUE;	//ADD TODA
}
///////////////////////////////////////////////////////////////
CListView::~CListView()
{
	//ADD START TODA (棜楌/専嶕偺嶍彍傪捛壛)
	//棜楌偺嶍彍
	DeleteHistory(m_lpHistory);

	//専嶕寢壥偺嶍彍
	DeleteSearch(m_lpSearchData);
	//ADD END
}
///////////////////////////////////////////////////////////////
void CListView::Init(HWND hwndParent)
{
	//愝掕撉傒崬傒
	GetSettings();

	//MOD START TODA (from GSFinder ver.1.99)
	DWORD dwStyle = DEF_LIST_STYLE /*| m_Settings.dwListStyle*/;
	DWORD dwExStyle = NULL;//WS_EX_CLIENTEDGE;

#ifdef __POCKET_PC
	dwExStyle = 0;

//DEL START TODA (昞帵愝掕張棟傪偁偲偱幚峴)
//	if (m_Settings.dwListStyle == LVS_REPORT && m_Settings.bHideHeader)
//		dwStyle |= LVS_NOCOLUMNHEADER;
//DEL END
#endif
	m_hWnd = CreateWindowEx(dwExStyle,
							WC_LISTVIEW,
							NULL, dwStyle, 0, 0, 0, 0,
							hwndParent, (HMENU)ID_LISTVIEW,
							g_hInst, NULL);
	//MOD END

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

//DEL START TODA (昞帵愝掕張棟傪偁偲偱幚峴)
//	//MOD START TODA (from GSFinder ver.1.99)
//	if (m_Settings.dwListStyle == LVS_REPORT)
//		ListView_SetExtendedListViewStyle(m_hWnd, ListView_GetExtendedListViewStyle(m_hWnd) | (DEF_LIST_EXSTYLE|m_Settings.dwListExStyle));
//	//MOD END
//
//	if (m_Settings.dwListStyle == LVS_ICON)
//		ListView_SetIconSpacing(m_hWnd, 72, 72);
//
//#ifdef __POCKET_PC
//	SendMessage(m_hWnd, CCM_SETVERSION, COMCTL32_VERSION, 0);
//#endif
//DEL END

	//弶婜壔
	LVCOLUMN lvc;
	lvc.mask = LVCF_FMT | LVCF_SUBITEM | LVCF_TEXT | LVCF_WIDTH;
	lvc.fmt = LVCFMT_LEFT;
	lvc.cx = m_Settings.nNameColumnSize;
	lvc.pszText = IDS_COLUMN_NAME;
	lvc.iSubItem = 0;
	ListView_InsertColumn(m_hWnd, 0, &lvc);
	lvc.fmt = LVCFMT_RIGHT;
	lvc.cx = m_Settings.nSizeColumnSize;
	lvc.pszText = IDS_COLUMN_SIZE;
	lvc.iSubItem = 1;
	ListView_InsertColumn(m_hWnd, 1, &lvc);
	lvc.fmt = LVCFMT_LEFT;
	lvc.cx = m_Settings.nTypeColumnSize;
	lvc.pszText = IDS_COLUMN_TYPE;
	lvc.iSubItem = 2;
	ListView_InsertColumn(m_hWnd, 2, &lvc);
	lvc.fmt = LVCFMT_LEFT;
	lvc.cx = m_Settings.nTimeColumnSize;
	lvc.pszText = IDS_COLUMN_DATE;
	lvc.iSubItem = 3;
	ListView_InsertColumn(m_hWnd, 3, &lvc);

	SetImageList();

	if (g_lpszFirstLoadFolder == NULL)
	{
		//僐儅儞僪儔僀儞僷儔儊乕僞旕巜掕帪
		if (m_Settings.bSaveFolder)
		{
			DWORD dwAttr = GetFileAttributes(m_szCurrentFolder);
			if (dwAttr == 0xFFFFFFFF || (dwAttr & FILE_ATTRIBUTE_DIRECTORY) != FILE_ATTRIBUTE_DIRECTORY)
				wcscpy(m_szCurrentFolder, _T(""));
		}
		else
			wcscpy(m_szCurrentFolder, _T(""));
	}
	else 
	{
		DWORD dwAttr = GetFileAttributes(g_lpszFirstLoadFolder);
		if (dwAttr != 0xFFFFFFFF && (dwAttr & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY)
			wcscpy(m_szCurrentFolder, g_lpszFirstLoadFolder);
	}

//DEL START TODA
//	g_MainWnd.m_CmdBands.SetCheckListStyle(m_Settings.dwListStyle, m_Settings.dwListExStyle);	//MOD TODA
//DEL END
	g_MainWnd.m_CmdBands.SetCheckSort(m_Settings.nSort, m_Settings.bSortRaise);
	g_MainWnd.m_CmdBands.SetEnableEditPaste(FALSE);
	m_hMenuPopup = LoadMenu(g_hInst, (LPCTSTR)IDR_POPUP);

	InitOpenAppMenu();
	InitUserPathMenu();		//ADD TODA
	InitFavoritesMenu();	//ADD TODA

	//昞帵宍幃愝掕
	OnChangeListStyle(0);	//ADD TODA
}

///////////////////////////////////////////////////////////////
void CListView::Destroy()
{
	//愝掕傪曐懚
	SaveSettings();

	if (m_lpliinfo)
	{
		delete[] m_lpliinfo;
		m_lpliinfo = NULL;
		m_nCount = 0;
	}

	int i;
	for (i = 0; i < m_nOpenAppInfoCount; i++)
	{
		OPENAPPINFO* poa= m_lpOpenAppInfo[i];
		if (poa)
		{
			delete poa->lpszPath;
			delete poa;
			m_lpOpenAppInfo[i] = NULL;
		}
	}

	m_nOpenAppInfoCount = NULL;

	DeleteAllItem();
	DeleteUserPathMenu();		//ADD TODA
	DeleteFavoritesMenu();		//ADD TODA

	DestroyMenu(m_hMenuPopup);

	m_FileImageListLarge.Destroy();
	m_FileImageListSmall.Destroy();
	DestroyWindow(m_hWnd);
}

///////////////////////////////////////////////////////////////
void CListView::SetImageList()
{
	m_FileImageListSmall.InitImageList(FALSE);
	ListView_SetImageList(m_hWnd, m_FileImageListSmall.m_hImageList, LVSIL_SMALL);
	m_FileImageListLarge.InitImageList(TRUE);
	ListView_SetImageList(m_hWnd, m_FileImageListLarge.m_hImageList, LVSIL_NORMAL);

	if ((m_Settings.dwListStyle&LVS_TYPEMASK)==LVS_ICON)
		m_pFileImageList = &m_FileImageListLarge;
	else
		m_pFileImageList = &m_FileImageListSmall;
}
///////////////////////////////////////////////////////////////
void CListView::GetSettings()
{
	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)
	{
		DWORD dwType;
		BYTE* lpData;
		DWORD dwDataSize;
		BYTE bString[MAX_PATH*2];

		//m_Settings
		dwType = REG_BINARY;
		lpData = new BYTE[sizeof(m_Settings)];
		dwDataSize = sizeof(m_Settings);
		if (RegQueryValueEx(hKey, _T("ListView"), 0, &dwType, lpData, &dwDataSize) == ERROR_SUCCESS)
		{
			if(dwDataSize == sizeof(m_Settings))	//ADD TODA (僒僀僘僠僃僢僋捛壛)
				memcpy(&m_Settings, lpData, sizeof(m_Settings));
		}
		delete[] lpData;

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

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

		//m_lpOpenPthInfo
		CUserPathDlg *pup = new CUserPathDlg((HWND)0, (HINSTANCE)0);
		for(int i=0; i<iTemp; i++)
		{
			BYTE bString[MAX_PATH*sizeof(TCHAR)];
			dwType = REG_SZ;
			dwDataSize = sizeof(bString);
			TCHAR szKey[16];
			wsprintf(szKey, _T("OpenPthInfo%d"), i);
			if (RegQueryValueEx(hKey, szKey, 0, &dwType, bString, &dwDataSize) == ERROR_SUCCESS)
			{
				pup->AddPath(i, (LPTSTR)bString);

⌨️ 快捷键说明

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