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的错误.