sysimagelist.cpp

来自「管理项目进度工具的原代码」· C++ 代码 · 共 220 行

CPP
220
字号
// SysImageList.cpp: implementation of the CSysImageList class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "SysImageList.h"
#include "driveinfo.h"
#include "filemisc.h"

#include <shlwapi.h>     

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CSysImageList::CSysImageList(BOOL bLargeIcons) : 
							m_bLargeIcons(bLargeIcons), 
							m_nFolderImage(-1), 
							m_nHtmlImage(-1), 
							m_hImageList(NULL),
							m_nRemoteFolderImage(-1)
{

}

CSysImageList::~CSysImageList()
{

}

BOOL CSysImageList::Initialize()
{
	if (m_hImageList)
		return TRUE;

	// set up system image list
	char szWindows[MAX_PATH];
	GetWindowsDirectory(szWindows, MAX_PATH);

	SHFILEINFO sfi;

	UINT nFlags = SHGFI_SYSICONINDEX | (m_bLargeIcons ? SHGFI_ICON : SHGFI_SMALLICON);
	HIMAGELIST hIL = (HIMAGELIST)SHGetFileInfo(szWindows, 0, &sfi, sizeof(sfi), nFlags);

	if (hIL)
	{
		m_hImageList = hIL;

		// intialize the stock icons
		m_nFolderImage = sfi.iIcon;

		// intialize html and remote folder images on demand
	}

	// else
	return (m_hImageList != NULL);
}

int CSysImageList::GetImageIndex(LPCTSTR szFile)
{
	if (!m_hImageList && !Initialize())
		return -1;

	SHFILEINFO sfi;

	UINT nFlags = SHGFI_SYSICONINDEX | SHGFI_USEFILEATTRIBUTES  | (m_bLargeIcons ? SHGFI_ICON : SHGFI_SMALLICON);
	HIMAGELIST hIL = (HIMAGELIST)SHGetFileInfo(szFile, FILE_ATTRIBUTE_NORMAL, &sfi, sizeof(sfi), nFlags);

	if (hIL)
		return sfi.iIcon;

	return -1;
}

int CSysImageList::GetFileImageIndex(LPCTSTR szFilePath, BOOL bFailUnKnown)
{
	if (!m_hImageList && !Initialize() || !szFilePath || !(*szFilePath))
		return -1;

	// test for web protocol
	if (IsWebAddress(szFilePath))
	{
		if (m_nHtmlImage == -1)
			m_nHtmlImage = GetImageIndex("test.html");

		return m_nHtmlImage;
	}

	// get the file's extension
	CString sExt;
	FileMisc::SplitPath(szFilePath, NULL, NULL, NULL, &sExt);

	// check if its a folder first if it has no extension
	if (sExt.IsEmpty())
	{
		// if its a remote path then simply assume it is a folder for now
		if (CDriveInfo::IsRemotePath(szFilePath, FALSE))
		{
			if (m_nRemoteFolderImage == -1)
		        m_nRemoteFolderImage = GetImageIndex("\\\\dummy\\.");

			return m_nRemoteFolderImage;
		}
		
		// else
		if (FileMisc::FolderExists(szFilePath))
			return m_nFolderImage;
	}

	// fail if no extension
	if (bFailUnKnown && sExt.IsEmpty())
		return -1;

	// use the entire path if <= MAX_PATH in length else just the extension
	if (lstrlen(szFilePath) > MAX_PATH)
		szFilePath = sExt;

	// else
	SHFILEINFO sfi;

	UINT nFlags = SHGFI_SYSICONINDEX | SHGFI_USEFILEATTRIBUTES | (m_bLargeIcons ? SHGFI_ICON : SHGFI_SMALLICON);
	HIMAGELIST hIL = (HIMAGELIST)SHGetFileInfo(szFilePath, FILE_ATTRIBUTE_NORMAL, &sfi, sizeof(sfi), nFlags);

	ASSERT (!hIL || hIL == m_hImageList);

	m_hImageList = hIL;

	if (!hIL)
		return -1;

	return sfi.iIcon;
}

int CSysImageList::GetFolderImageIndex() 
{ 
	if (!m_hImageList && !Initialize())
		return -1;

	return m_nFolderImage;
}

HICON CSysImageList::ExtractAppIcon()
{
	char szAppPath[MAX_PATH + 1];
	GetModuleFileName(NULL, szAppPath, MAX_PATH);

	return ExtractFileIcon(szAppPath);
}

HICON CSysImageList::ExtractFileIcon(LPCTSTR szFilePath)
{
	if (!m_hImageList && !Initialize())
		return NULL;

	int nIndex = GetFileImageIndex(szFilePath);

	if (nIndex != -1)
		return ImageList_GetIcon(m_hImageList, nIndex, 0);

	return NULL;
}

HICON CSysImageList::ExtractFolderIcon()
{
	if (!m_hImageList && !Initialize())
		return NULL;

	return ImageList_GetIcon(m_hImageList, m_nFolderImage, 0);
}

const CImageList* CSysImageList::GetImageList() const
{ 
	CImageList* pIL = CImageList::FromHandle(m_hImageList); 

	if (pIL)
		return pIL;

	// else
	static CImageList il;
	return &il;
}

CImageList* CSysImageList::GetImageList() 
{ 
	if (!m_hImageList)
		Initialize();

	CImageList* pIL = CImageList::FromHandle(m_hImageList); 

	if (pIL)
		return pIL;

	// else backup plan
	static CImageList il;
	return &il;
}

HIMAGELIST CSysImageList::GetHImageList() 
{ 
	if (!m_hImageList)
		Initialize();

	return m_hImageList; 
}

BOOL CSysImageList::IsWebAddress(LPCTSTR szFilePath)
{
	if (::PathIsURL(szFilePath))
		return TRUE;

	// check for www.
	return (CString(szFilePath).Find("www.") == 0);
}

⌨️ 快捷键说明

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