1. 使用SHGetFileInfo 函數提取文件ICON:
// 頭文件 ICONExtracter.h
//---------------------------------------------------------------------------------------------------------------
class CIconExtracter
{
public:
CIconExtracter(void);
~CIconExtracter(void);
public:
HIMAGELIST GetDirIconsList( const TCHAR* DirPath, bool bSmallIcon );
UINT GetDirIndex( bool bSmallIcon );
UINT GetFileIndex( const TCHAR* FilePath, bool bSmallIcon );
HICON GetDirIcon( bool bSmallIcon );
HICON GetFileIcon( const TCHAR* FilePath, bool bSmallIcon );
};
//---------------------------------------------------------------------------------------------------------------
// 實現文件 iconextracter.cpp
//---------------------------------------------------------------------------------------------------------------
#include ".iconextracter.h"
CIconExtracter::CIconExtracter(void)
{
}
CIconExtracter::~CIconExtracter(void)
{
}
HIMAGELIST CIconExtracter::GetDirIconsList( const TCHAR* DirPath, bool bSmallIcon )
{
SHFILEINFO sfi;
DWORD dwFlag = SHGFI_SYSICONINDEX;
dwFlag |= bSmallIcon ? SHGFI_SMALLICON : SHGFI_LARGEICON;
return (HIMAGELIST)SHGetFileInfo( DirPath, 0, &sfi, sizeof( SHFILEINFO ), dwFlag );
}
UINT CIconExtracter::GetDirIndex( bool bSmallIcon )
{
SHFILEINFO sfi;
DWORD dwFlag = SHGFI_SYSICONINDEX | SHGFI_USEFILEATTRIBUTES;
dwFlag |= bSmallIcon ? SHGFI_SMALLICON : SHGFI_LARGEICON;
SHGetFileInfo( _T("other"), FILE_ATTRIBUTE_DIRECTORY, &sfi, sizeof( SHFILEINFO ), dwFlag );
return sfi.iIcon;
}
UINT CIconExtracter::GetFileIndex( const TCHAR* FilePath, bool bSmallIcon )
{
SHFILEINFO sfi;
DWORD dwFlag = SHGFI_SYSICONINDEX | SHGFI_USEFILEATTRIBUTES;
dwFlag |= bSmallIcon ? SHGFI_SMALLICON : SHGFI_LARGEICON;
SHGetFileInfo( FilePath, FILE_ATTRIBUTE_NORMAL, &sfi, sizeof( SHFILEINFO ), dwFlag );
return sfi.iIcon;
}
HICON CIconExtracter::GetDirIcon( bool bSmallIcon )
{
SHFILEINFO sfi;
DWORD dwFlag = SHGFI_SYSICONINDEX | SHGFI_USEFILEATTRIBUTES;
dwFlag |= bSmallIcon ? SHGFI_SMALLICON : SHGFI_LARGEICON;
SHGetFileInfo( _T("no mattor"), FILE_ATTRIBUTE_DIRECTORY, &sfi, sizeof( SHFILEINFO ), dwFlag );
return sfi.hIcon;
}
HICON CIconExtracter::GetFileIcon( const TCHAR* FilePath, bool bSmallIcon )
{
SHFILEINFO sfi= {0};
DWORD dwFlag = SHGFI_ICON | SHGFI_USEFILEATTRIBUTES;
dwFlag |= bSmallIcon ? SHGFI_SMALLICON : SHGFI_LARGEICON;
SHGetFileInfo( FilePath, FILE_ATTRIBUTE_NORMAL, &sfi, sizeof( SHFILEINFO ), dwFlag );
return sfi.hIcon;
}
bool CFileAndDirCopier::FileOperation( UINT Operate, CString& SrcPath, CString& DestPath )
{
SrcPath += _T('/0'); //--: PC相上要加該行, wince下可不用
SHFILEOPSTRUCT fp = {0};
fp.hwnd = GetSafeHwnd();
fp.wFunc = Operate;
fp.pFrom = SrcPath.GetBuffer( SrcPath.GetLength() + 1 );
fp.pTo = DestPath.GetBuffer( DestPath.GetLength() + 1 );
fp.fFlags = 0;
int rt = SHFileOperation( &fp );
SrcPath.ReleaseBuffer();
DestPath.ReleaseBuffer();
}
使用部分函數:
void CFileAndDirCopier::OnBnClickedButtonCopy()
{
UpdateData( TRUE );
FileOperation( FO_COPY, m_SrcPath, m_DestPath );
return;
}
void CFileAndDirCopier::OnBnClickedButtonMove()
{
UpdateData( TRUE );
FileOperation( FO_MOVE, m_SrcPath, m_DestPath );
return;
}
void CFileAndDirCopier::OnBnClickedButtonRename()
{
UpdateData( TRUE );
FileOperation( FO_RENAME, m_SrcPath, m_DestPath );
return;
}
void CFileAndDirCopier::OnBnClickedButtonDelete()
{
UpdateData( TRUE );
FileOperation( FO_DELETE, m_SrcPath, m_DestPath );
return;
}
1. 使用SHGetFileInfo 函數提取文件ICON:
// 頭文件 ICONExtracter.h
//---------------------------------------------------------------------------------------------------------------
class CIconExtracter
{
public:
CIconExtracter(void);
~CIconExtracter(void);
public:
HIMAGELIST GetDirIconsList( const TCHAR* DirPath, bool bSmallIcon );
UINT GetDirIndex( bool bSmallIcon );
UINT GetFileIndex( const TCHAR* FilePath, bool bSmallIcon );
HICON GetDirIcon( bool bSmallIcon );
HICON GetFileIcon( const TCHAR* FilePath, bool bSmallIcon );
};
//---------------------------------------------------------------------------------------------------------------
// 實現文件 iconextracter.cpp
//---------------------------------------------------------------------------------------------------------------
#include ".iconextracter.h"
CIconExtracter::CIconExtracter(void)
{
}
CIconExtracter::~CIconExtracter(void)
{
}
HIMAGELIST CIconExtracter::GetDirIconsList( const TCHAR* DirPath, bool bSmallIcon )
{
SHFILEINFO sfi;
DWORD dwFlag = SHGFI_SYSICONINDEX;
dwFlag |= bSmallIcon ? SHGFI_SMALLICON : SHGFI_LARGEICON;
return (HIMAGELIST)SHGetFileInfo( DirPath, 0, &sfi, sizeof( SHFILEINFO ), dwFlag );
}
UINT CIconExtracter::GetDirIndex( bool bSmallIcon )
{
SHFILEINFO sfi;
DWORD dwFlag = SHGFI_SYSICONINDEX | SHGFI_USEFILEATTRIBUTES;
dwFlag |= bSmallIcon ? SHGFI_SMALLICON : SHGFI_LARGEICON;
SHGetFileInfo( _T("other"), FILE_ATTRIBUTE_DIRECTORY, &sfi, sizeof( SHFILEINFO ), dwFlag );
return sfi.iIcon;
}
UINT CIconExtracter::GetFileIndex( const TCHAR* FilePath, bool bSmallIcon )
{
SHFILEINFO sfi;
DWORD dwFlag = SHGFI_SYSICONINDEX | SHGFI_USEFILEATTRIBUTES;
dwFlag |= bSmallIcon ? SHGFI_SMALLICON : SHGFI_LARGEICON;
SHGetFileInfo( FilePath, FILE_ATTRIBUTE_NORMAL, &sfi, sizeof( SHFILEINFO ), dwFlag );
return sfi.iIcon;
}
HICON CIconExtracter::GetDirIcon( bool bSmallIcon )
{
SHFILEINFO sfi;
DWORD dwFlag = SHGFI_SYSICONINDEX | SHGFI_USEFILEATTRIBUTES;
dwFlag |= bSmallIcon ? SHGFI_SMALLICON : SHGFI_LARGEICON;
SHGetFileInfo( _T("no mattor"), FILE_ATTRIBUTE_DIRECTORY, &sfi, sizeof( SHFILEINFO ), dwFlag );
return sfi.hIcon;
}
HICON CIconExtracter::GetFileIcon( const TCHAR* FilePath, bool bSmallIcon )
{
SHFILEINFO sfi= {0};
DWORD dwFlag = SHGFI_ICON | SHGFI_USEFILEATTRIBUTES;
dwFlag |= bSmallIcon ? SHGFI_SMALLICON : SHGFI_LARGEICON;
SHGetFileInfo( FilePath, FILE_ATTRIBUTE_NORMAL, &sfi, sizeof( SHFILEINFO ), dwFlag );
return sfi.hIcon;
}
2. 通過SHFileOperation 外殼函數來拷貝目錄及文件:
-- 函數原型如:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/reference/functions/shfileoperation.asp
注: 在使用CString做爲參數時,要用GetBuffer方式來讀取原字串否則會出一些copy的錯誤.
{
SHFILEOPSTRUCT fp = {0};
fp.hwnd = GetSafeHwnd();
fp.wFunc = FO_COPY;
fp.pFrom = SrcFile.GetBuffer(SrcFile.GetLength() + 1);
fp.pTo = DestFile.GetBuffer(DestFile.GetLength() + 1);
fp.fFlags = 0;
int rt = SHFileOperation( &fp );
SrcFile.ReleaseBuffer(SrcFile.GetLength() + 1 );
DestFile.ReleaseBuffer(SrcFile.GetLength() + 1 );
return ( rt == 0);
}
2. 通過SHFileOperation 外殼函數來拷貝目錄及文件:
-- 函數原型如:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/reference/functions/shfileoperation.asp
注: 在使用CString做爲參數時,要用GetBuffer方式來讀取原字串否則會出一些copy的錯誤.