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

📄 fileimagelist.cpp

📁 PocketPC上很好用的文件管理器,而且里面的封装性很好,学windows mobile开发的兄弟,值得一看
💻 CPP
字号:
///////////////////////////////////////////////////////////////
//FileImageList.cpp
//僼傽僀儖偺傾僀僐儞傪娗棟

#include "GSFinder.h"
#include "FileImageList.h"

///////////////////////////////////////////////////////////////
CFileImageList::CFileImageList()
{
	m_hImageList = NULL;
	m_bLargeIcon = FALSE;
}

///////////////////////////////////////////////////////////////
CFileImageList::~CFileImageList()
{
}

///////////////////////////////////////////////////////////////
void CFileImageList::InitImageList(BOOL bLarge)
{
	//僀儊乕僕儕僗僩偺弶婜壔
	if (m_hImageList) Destroy();

	HICON hIcon;
	if (!bLarge)
	{
		m_hImageList = ImageList_Create(16, 16, ILC_COLOR | ILC_MASK, 3, 3);
		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_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 (from GSFinder ver.1.99)
		hIcon = (HICON)LoadImage(g_hInst, (LPCTSTR)IDI_START_S, IMAGE_ICON, 16, 16, 0);
		ImageList_AddIcon(m_hImageList, hIcon);
		DestroyIcon(hIcon);
		//ADD END
		hIcon = (HICON)LoadImage(g_hInst, (LPCTSTR)IDI_FILE_S, IMAGE_ICON, 16, 16, 0);
		ImageList_AddIcon(m_hImageList, hIcon);
		DestroyIcon(hIcon);
		hIcon = (HICON)LoadImage(g_hInst, (LPCTSTR)IDI_ROM_S, IMAGE_ICON, 16, 16, 0);
		ImageList_AddIcon(m_hImageList, hIcon);
		DestroyIcon(hIcon);
		//ADD START TODA
		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_COMPRESS_S, IMAGE_ICON, 16, 16, 0);
		ImageList_AddIcon(m_hImageList, hIcon);
		DestroyIcon(hIcon);
		//ADD END
		m_bLargeIcon = FALSE;
	}
	else
	{
		m_hImageList = ImageList_Create(32, 32, ILC_COLOR | ILC_MASK, 3, 3);
		hIcon = LoadIcon(g_hInst, (LPCTSTR)IDI_FOLDER_L);
		ImageList_AddIcon(m_hImageList, hIcon);
		DestroyIcon(hIcon);
		hIcon = LoadIcon(g_hInst, (LPCTSTR)IDI_TEMP_L);
		ImageList_AddIcon(m_hImageList, hIcon);
		DestroyIcon(hIcon);
		hIcon = LoadIcon(g_hInst, (LPCTSTR)IDI_MYDOCUMENTS_L);
		ImageList_AddIcon(m_hImageList, hIcon);
		DestroyIcon(hIcon);
		//ADD START TODA (from GSFinder ver.1.99)
		hIcon = LoadIcon(g_hInst, (LPCTSTR)IDI_START_L);
		ImageList_AddIcon(m_hImageList, hIcon);
		DestroyIcon(hIcon);
		//ADD END
		hIcon = LoadIcon(g_hInst, (LPCTSTR)IDI_FILE_L);
		ImageList_AddIcon(m_hImageList, hIcon);
		DestroyIcon(hIcon);
		hIcon = LoadIcon(g_hInst, (LPCTSTR)IDI_ROM_L);
		ImageList_AddIcon(m_hImageList, hIcon);
		DestroyIcon(hIcon);
		//ADD START TODA
		hIcon = LoadIcon(g_hInst, (LPCTSTR)IDI_NETFOLDER_L);
		ImageList_AddIcon(m_hImageList, hIcon);
		DestroyIcon(hIcon);
		hIcon = LoadIcon(g_hInst, (LPCTSTR)IDI_COMPRESS_L);
		ImageList_AddIcon(m_hImageList, hIcon);
		DestroyIcon(hIcon);
		//ADD END
		m_bLargeIcon = TRUE;
	}
}

///////////////////////////////////////////////////////////////
void CFileImageList::Destroy()
{
	
	while (!m_IndexBuff.IsEmpty())
	{
		IMAGELISTINDEX* pIndex = (IMAGELISTINDEX*)m_IndexBuff.RemoveAt(0);
		if (pIndex != NULL)
			delete pIndex;
	}
	ImageList_RemoveAll(m_hImageList);
	ImageList_Destroy(m_hImageList);
}

///////////////////////////////////////////////////////////////
BOOL SeekIndexCallback(LPARAM lParamItem, LPARAM lParamFind)
{
	IMAGELISTINDEX* pIndex = (IMAGELISTINDEX*)lParamItem;
	LPTSTR pszExt = (LPTSTR)lParamFind;
	if (wcsicmp(pszExt, pIndex->szExt)==0)
		return FALSE;
	else
		return TRUE;
}

///////////////////////////////////////////////////////////////
int MyAddIcon(HIMAGELIST hImageList, HWND hWnd, HICON hIcon, BOOL bLarge)
{
	HDC hDC = GetDC(hWnd);
	HDC hMemDC = CreateCompatibleDC(hDC);
	HBITMAP hBitmap = CreateCompatibleBitmap(hDC, 64, 64);
	ReleaseDC(hWnd, hDC);

	SelectObject(hMemDC, hBitmap);
	DrawIcon(hMemDC, 0, 0, hIcon);
	if(bLarge)
		StretchBlt(hMemDC, 0, 0, 32, 32, hMemDC, 0, 0, 64, 64, SRCCOPY);
	else
		StretchBlt(hMemDC, 0, 0, 16, 16, hMemDC, 0, 0, 64, 64, SRCCOPY);

	DeleteDC(hMemDC);
	
	int nIndex = ImageList_AddMasked(hImageList, hBitmap, RGB(0,0,0));
	
	DeleteObject(hBitmap);

	return nIndex;
}
///////////////////////////////////////////////////////////////
int CFileImageList::GetImageListIndex(LPCTSTR lpszFileName, LPCTSTR lpszPath, DWORD dwAttr)
{
	TCHAR szExt[MAX_PATH];
	int nIndex;

	if (dwAttr == 0)
		return 0;

	if (FILE_ATTRIBUTE_DIRECTORY == (dwAttr & FILE_ATTRIBUTE_DIRECTORY)) {
		//MOD TODA
//		if (wcsicmp(lpszFileName, _T("My Documents")) == 0)
		if (wcsicmp(lpszFileName, g_MainWnd.m_lpszMyDocument) == 0)
			return 2;

		//ADD START TODA (from GSFinder ver.1.99)
		if (wcsicmp(lpszFileName, g_MainWnd.m_lpszStartMenu) == 0)
			return 3;
		//ADD END

		//ADD START TODA
		if (wcsicmp(lpszFileName, g_MainWnd.m_lpszNetwork) == 0)
			return 6;
		//ADD END

		return (dwAttr & FILE_ATTRIBUTE_TEMPORARY) ? 1 : 0;
	}
	
	if (g_MainWnd.m_ListView.m_ImageListSettings.bNotLoadROMIcon)
	{
		if (dwAttr & FILE_ATTRIBUTE_INROM)
			return 5;
	}

	//僼傽僀儖偺傾僀僐儞傪撉傒崬傑側偄
	if (g_MainWnd.m_ListView.m_ImageListSettings.bNotLoadFileIcon)
		return 4;

	LPTSTR lpszExt = wcsrchr(lpszFileName, _T('.'));
	if (lpszExt == NULL)
		wcscpy(szExt, _T("\\\\\\"));
	else if (wcsicmp(lpszExt, _T(".EXE")) == 0 || wcsicmp(lpszExt, _T(".LNK")) == 0)
		wsprintf(szExt, _T("%s\\%s"), lpszPath, lpszFileName);
	//ADD START TODA (埑弅僼傽僀儖懳墳)
	else if(wcsicmp(lpszExt, _T(".LZH")) == 0 || wcsicmp(lpszExt, _T(".ZIP")) == 0)
	{
		if(g_MainWnd.m_ListView.m_ImageListSettings.bNotLoadCompIcon)
			return 7;
		
		if(g_MainWnd.m_ListView.m_Settings.bDblClick)
		{
			if(g_MainWnd.m_Compress.IsCompress(COMPDLL_MODE_LHA) && wcsicmp(lpszExt, _T(".LZH")) == 0)
				return 7;
			if(g_MainWnd.m_Compress.IsCompress(COMPDLL_MODE_ZIP) && wcsicmp(lpszExt, _T(".ZIP")) == 0)
				return 7;
		}
		wcscpy(szExt, lpszExt);
	}
	//ADD END
	else
		wcscpy(szExt, lpszExt);

	//ADD START TODA (from Y.Nagamidori)
	// 僱僢僩儚乕僋僼僅儖僟偺応崌
	if (lpszExt && wcsicmp(lpszExt, _T(".LNK")) == 0) {
		TCHAR szTarget[MAX_PATH];
		SHGetShortcutTarget(szExt, szTarget, MAX_PATH);
		LPTSTR p = szTarget;
		if (*p == _T('\"')) p++;
		if (*p == _T('\\') && *(p + 1) == _T('\\') && !wcschr(p + 2, _T('\\')))
			return 6;
	}
	//ADD END

	//僀儞僨僢僋僗偺専嶕
	nIndex = m_IndexBuff.Find(SeekIndexCallback, 0, (DWORD)szExt);
	if (nIndex >= 0)
	{
		IMAGELISTINDEX* pRet = (IMAGELISTINDEX*)m_IndexBuff.GetAt(nIndex);
		return pRet->nIndex;
	}

	//ADD START TODA
	//僪儔僢僌拞偼傾僀僐儞搊榐偼偟側偄(傾僀僐儞偑摟夁忬懺偺堊)
	if(g_bDraging) return 4;
	//ADD END

	TCHAR szFileName[MAX_PATH];
	SHFILEINFO shfi;
	wsprintf(szFileName, _T("%s\\%s"), lpszPath, lpszFileName);

	//MOD START TODA(VGA懳墳)
#if 0	//仸傾僀僐儞弅彫偑晄昁梫側堊丄尰嵼枹巊梡
	SHGetFileInfo(szFileName, NULL, &shfi, sizeof(shfi),
		(m_bLargeIcon||g_MainWnd.VGACheck())?SHGFI_LARGEICON | SHGFI_ICON:SHGFI_SMALLICON | SHGFI_ICON);	
	if(g_MainWnd.VGACheck())
		nIndex = MyAddIcon(m_hImageList, g_MainWnd.m_hWnd, shfi.hIcon, m_bLargeIcon);
	else
#else
	SHGetFileInfo(szFileName, NULL, &shfi, sizeof(shfi),
		m_bLargeIcon?SHGFI_LARGEICON | SHGFI_ICON:SHGFI_SMALLICON | SHGFI_ICON);
#endif
	nIndex = ImageList_AddIcon(m_hImageList, shfi.hIcon);	//Original
	//MOD END
	if (nIndex == -1)
		nIndex = 4;

	//ADD START TODA
	DestroyIcon(shfi.hIcon);
	//ADD END

	IMAGELISTINDEX* pIndex = new IMAGELISTINDEX;
	memset(pIndex, 0, sizeof(IMAGELISTINDEX));
	pIndex->nIndex = nIndex;
	wcscpy(pIndex->szExt, szExt);
	m_IndexBuff.Insert((DWORD)pIndex);
	return nIndex;
}

///////////////////////////////////////////////////////////////
void CFileImageList::RefreshIcon(LPCTSTR lpszPath)
{
	if (g_MainWnd.m_ListView.m_ImageListSettings.bNotLoadFileIcon) return;

	TCHAR szFileName[MAX_PATH] = _T("");
	TCHAR szParent[MAX_PATH] = _T("");

	LPTSTR lpszTemp = wcsrchr(lpszPath, _T('\\'));
	if (lpszTemp)
		wcsncpy(szParent, lpszPath, lpszTemp-lpszPath);
	else
		wcscpy(szParent, _T(""));

	lpszTemp = wcsrchr(lpszPath, _T('\\'));
	if (lpszTemp)
		wcscpy(szFileName, ++lpszTemp);
	else
		wcscpy(szFileName, lpszPath);

	int nIndex = GetImageListIndex(szFileName, szParent, GetFileAttributes(szFileName));
	
	if (nIndex <= 7)	//MOD TODA (5 -> 7)
		return;

	SHFILEINFO shfi;
	SHGetFileInfo(lpszPath, NULL, &shfi, sizeof(shfi), m_bLargeIcon?SHGFI_LARGEICON | SHGFI_ICON:SHGFI_SMALLICON | SHGFI_ICON);
	ImageList_ReplaceIcon(m_hImageList, nIndex, shfi.hIcon);
}
///////////////////////////////////////////////////////////////

⌨️ 快捷键说明

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