请教一个获取文件图标的问题

wowoandlyn 2011-08-08 09:02:30
我希望获取本地文件的图标,并且将这个图标画到按钮上,代码如下:

ZeroMemory(&sfi,sizeof(SHFILEINFO));
dRet = SHGetFileInfo(m_strPathName,0,&sfi,sizeof(sfi),SHGFI_ICON);

m_Button.Create(m_strFileName, BS_ICON|WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, cRect, this, IDC_BUTTON1+100+i-1);
//CWinApp *pApp = AfxGetApp();
//HICON hIcon = pApp->LoadIcon(IDI_ICON1);
m_Button.SetIcon(sfi.hIcon);
DestroyIcon(sfi.hIcon);

其中注释掉的部分,是我在本地资源中创建一个图标并且加载没有问题,按钮的能显示,可是我试图获取本地文件的图标并且加载,按钮上没有出现希望的图标,希望得到解答,谢谢!
文件名确认过了,没有问题,执行过SHGetFileInfo之后,监控结果如下:
dRet:1

sfi:0x0012f190 {hIcon=0x0f590695 iIcon=4 dwAttributes=1077936503 ...} _SHFILEINFOW *
感觉sfi.hIcon也有值,但就是SetIcon执行之后,按钮没有任何变化,将sfi.hIcon换成hIcon(本地创建的图标)就能改变。
...全文
104 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
wowoandlyn 2011-08-09
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 visualeleven 的回复:]

C/C++ code
SHFILEINFO sfi;
CString m_strPathName(_T("F:\\12.bmp"));
CRect cRect(CPoint(0, 0), CSize(100, 30));
static CButton m_Button;

ZeroMemory(&sfi,sizeof(SHFILEINFO));
……
[/Quote]
找到问题了,我在SetIcon之后执行了DestroyIcon,把这句屏蔽掉就OK了。。。
怪自己,没留意msdn上介绍的是“when you no longer need it”,光看前半句提示记得执行DestroyIcon了。。。
wowoandlyn 2011-08-08
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 visualeleven 的回复:]

C/C++ code
SHFILEINFO sfi;
CString m_strPathName(_T("F:\\12.bmp"));
CRect cRect(CPoint(0, 0), CSize(100, 30));
static CButton m_Button;

ZeroMemory(&sfi,sizeof(SHFILEINFO));
……
[/Quote]
应该是我本地按钮的问题,我试了你的代码,赋值我的文件名,没问题,图标出来了,但换用我本地的按钮就出问题了,我研究下,我本地的按钮是把指针存vec里面new的按钮,不知道是不是这里的问题。
Eleven 2011-08-08
  • 打赏
  • 举报
回复
SHFILEINFO sfi;
CString m_strPathName(_T("F:\\12.bmp"));
CRect cRect(CPoint(0, 0), CSize(100, 30));
static CButton m_Button;

ZeroMemory(&sfi,sizeof(SHFILEINFO));
VERIFY(SHGetFileInfo(m_strPathName,0,&sfi,sizeof(sfi),SHGFI_ICON));

if(NULL == m_Button.GetSafeHwnd())
m_Button.Create(_T(""), BS_ICON|WS_CHILD | WS_VISIBLE | BS_ICON | BS_PUSHBUTTON, cRect,
this, 0x11);
//CWinApp *pApp = AfxGetApp();
//HICON hIcon = pApp->LoadIcon(IDI_ICON1);
m_Button.SetIcon(sfi.hIcon);
// DestroyIcon(sfi.hIcon);
Eleven 2011-08-08
  • 打赏
  • 举报
回复
我用你的代码试过没有问题
wowoandlyn 2011-08-08
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 visualeleven 的回复:]

代码没问题,你的SHGetFileInfo函数调用成功?
[/Quote]
额,不是转义字符的问题。。。试了,结果仍旧一样。
wowoandlyn 2011-08-08
  • 打赏
  • 举报
回复
[Quote=引用楼主 wowoandlyn 的回复:]
我希望获取本地文件的图标,并且将这个图标画到按钮上,代码如下:
C/C++ code

ZeroMemory(&sfi,sizeof(SHFILEINFO));
dRet = SHGetFileInfo(m_strPathName,0,&sfi,sizeof(sfi),SHGFI_ICON);

m_Button.Create(m_strFileName, BS……
[/Quote]
刚想到,我查看了m_strPathName的值,如下

+ ATL::CSimpleStringT<wchar_t,1> "D:\Program Files\IDM Computer Solutions\UltraEdit\Uedit32.exe" ATL::CSimpleStringT<wchar_t,1>

会不会是中间的\只有一个的缘故?文件是我从CFileDialog对话框中得到的没有进行额外的处理。我看网上代码中的串都是\\。
wowoandlyn 2011-08-08
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 visualeleven 的回复:]

代码没问题,你的SHGetFileInfo函数调用成功?
[/Quote]

- sfi {hIcon=0x00270883 iIcon=6 dwAttributes=1077936503 ...} _SHFILEINFOW
+ hIcon 0x00270883 {unused=65537 } HICON__ *
iIcon 6 int
dwAttributes 1077936503 unsigned long
+ szDisplayName 0x0012f19c "" wchar_t [260]
+ szTypeName 0x0012f3a4 "" wchar_t [80]
debug的信息,我不是很确定是否成功,执行API之后dRet的值是1。
Eleven 2011-08-08
  • 打赏
  • 举报
回复
代码没问题,你的SHGetFileInfo函数调用成功?

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧