📄 fileimagelist.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 + -