那就是使用SHGetFileInfo函数,调用这个函数可以获得所有关于文件的信息。它有一个聪明的选项,SHGFI_USEFILEATTRIBUTES,这个选项允许你传递一个假文件名,如mumble.txt。即便文件不存在,SHGetFileInfo也能获得你要的信息。
SHFILEINFO shfi;
memset(&shfi,0,sizeof(shfi));
SHGetFileInfo("foo.bmp",
FILE_ATTRIBUTE_NORMAL,
&shfi, sizeof(shfi),
SHGFI_ICON|SHGFI_USEFILEATTRIBUTES);
需要注意的一点是:
If SHGetFileInfo returns an icon handle in the hIcon member of the SHFILEINFO structure pointed to by psfi, you are responsible for freeing it with tabindex="0" xmlns:mshelp="http://msdn.microsoft.com/mshelp" keywords="_win32_destroyicon">DestroyIcon when you no longer need it.
例子:
//CEdit m_ext;
//CStatic m_Icon;
LRESULT OnOK(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
// TODO: Add validation code
CString strExt;
char temp[256] = {0};
::GetWindowText(m_ext,temp,256);
strExt = temp;
strExt.TrimLeft(".");
CString strTemp = "nothing.";
strTemp += strExt;
SHFILEINFO shfi;
memset(&shfi,0,sizeof(shfi));
SHGetFileInfo(strTemp,
FILE_ATTRIBUTE_NORMAL,
&shfi,
sizeof(shfi),
SHGFI_ICON|SHGFI_USEFILEATTRIBUTES);
DestroyIcon(m_Icon.SetIcon(shfi.hIcon));
return 0;
}