如何使用 C++ 获取文件图标

发布于 2024-07-25 14:35:28 字数 497 浏览 6 评论 0原文

我想使用 C++ 将图标添加到树视图节点。 我想从系统中获取图标,我尝试过

PMString ucPath("C:\\path\\to\\file.extension");
SHFILEINFO info;    

::SHGetFileInfo(ucPath.GrabTString(), FILE_ATTRIBUTE_NORMAL, &info, sizeof(info),
    SHGFI_ICON | SHGFI_USEFILEATTRIBUTES | SHGFI_SMALLICON);

iconView->SetRsrcID((RsrcID) info.hIcon);
::DestroyIcon(info.hIcon);

其中 SetResrcID 、PMString 是 InDesing API, iconView 是树的 controlView ,我不明白出了什么问题,如果有人有想法,请提出建议。

谢谢, 普拉文·玛吉

I want to add Icon to treeview node, using C++. I want to get the icons from system, I tried

I tried with,

PMString ucPath("C:\\path\\to\\file.extension");
SHFILEINFO info;    

::SHGetFileInfo(ucPath.GrabTString(), FILE_ATTRIBUTE_NORMAL, &info, sizeof(info),
    SHGFI_ICON | SHGFI_USEFILEATTRIBUTES | SHGFI_SMALLICON);

iconView->SetRsrcID((RsrcID) info.hIcon);
::DestroyIcon(info.hIcon);

where, SetResrcID ,PMString are the InDesing API and iconView is the controlView of the Tree, I am not getting what's going wrong, if anyone has idea please suggest.

Thanks,
Praveen Mamdge

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

迷雾森÷林ヴ 2024-08-01 14:35:28

这是我在应用程序中使用的代码,您应该将图标更改为位图。

PMString ucPath("C:\\path\\to\\file.extension");
SHFILEINFO info;    

::SHGetFileInfo(ucPath.GrabTString(), FILE_ATTRIBUTE_NORMAL, &info, sizeof(info),
    SHGFI_ICON | SHGFI_USEFILEATTRIBUTES | SHGFI_SMALLICON);
ICONINFO stIconInfo;
GetIconInfo(s_sfi.hIcon, &stIconInfo);
HBITMAP hBmp = stIconInfo.hbmColor;
DestroyIcon(s_sfi.hIcon) ;

最好的方法是将系统图标索引与 SHGFI_SYSICONINDEX 一起使用。

Here is the codes what I'm using in my application, you should change the icon to a bitmap.

PMString ucPath("C:\\path\\to\\file.extension");
SHFILEINFO info;    

::SHGetFileInfo(ucPath.GrabTString(), FILE_ATTRIBUTE_NORMAL, &info, sizeof(info),
    SHGFI_ICON | SHGFI_USEFILEATTRIBUTES | SHGFI_SMALLICON);
ICONINFO stIconInfo;
GetIconInfo(s_sfi.hIcon, &stIconInfo);
HBITMAP hBmp = stIconInfo.hbmColor;
DestroyIcon(s_sfi.hIcon) ;

The best way to do it is using the system icon index with SHGFI_SYSICONINDEX.

和影子一齐双人舞 2024-08-01 14:35:28

像这样的一些事,
首先从文件中提取图标。

SHFILEINFO stFileInfo;
SHGetFileInfo( file,
               FILE_ATTRIBUTE_NORMAL,
               &stFileInfo,
               sizeof( stFileInfo ),
               SHGFI_ICON | SHGFI_LARGEICON );

然后添加到imagelist并使用索引设置图标。

m_nIndex = m_ilLargeIcons.Add( stFileInfo.hIcon );

Some thing like this,
Extract icon from file first.

SHFILEINFO stFileInfo;
SHGetFileInfo( file,
               FILE_ATTRIBUTE_NORMAL,
               &stFileInfo,
               sizeof( stFileInfo ),
               SHGFI_ICON | SHGFI_LARGEICON );

Then add to imagelist and use the index to set icon.

m_nIndex = m_ilLargeIcons.Add( stFileInfo.hIcon );
折戟 2024-08-01 14:35:28

这是你的代码片段,逐行观察:

PMString ucPath("C:\path\to\file.extension"); SHFILEINFO 信息;
::SHGetFileInfo(ucPath.GrabTString(), FILE_ATTRIBUTE_NORMAL, &info, sizeof(info),
SHGFI_图标 |
SHGFI_USEFILEATTRIBUTES | SHGFI_USEFILEATTRIBUTES | SHGFI_SMALLICON);

iconView->SetRsrcID((RsrcID) info.hIcon);

::DestroyIcon(info.hIcon);

在这一行之后:iconView->SetRsrcID((RsrcID) info.hIcon);,您调用了 ::DestroyIcon 来销毁您存储的图标。

This is your code snippet, observe line by line:

PMString ucPath("C:\path\to\file.extension"); SHFILEINFO info;
::SHGetFileInfo(ucPath.GrabTString(), FILE_ATTRIBUTE_NORMAL, &info, sizeof(info),
SHGFI_ICON |
SHGFI_USEFILEATTRIBUTES | SHGFI_SMALLICON);

iconView->SetRsrcID((RsrcID) info.hIcon);

::DestroyIcon(info.hIcon);

After this line: iconView->SetRsrcID((RsrcID) info.hIcon);, you called ::DestroyIcon that destroyed that icon you stored.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文