列表框显示进程图标

本文介绍了一种使用CReportCtrl类重绘列表框并获取进程图标的方法。通过SHGetFileInfo函数结合CImageList实现图标显示,并讨论了解决图标缺失的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

昨天调各种图标调了半了,改bug改到今天凌晨,总结一下昨天。
列表框中能够直接加入图标,但是不可以改变字体颜色、背景颜色等,因此我用了pudn上的一个类CReportCtrl
CReportCtrl
这个类把列表框给重绘了,功能十分强大。
下面说一下如何获取进程图标
.h
CImageList ProcessImg;//这个定义一定要放到头文件中,定义成全局变量,不然不会显示
.cpp
///////////////////////////////////////////////////////////////////////
//一些初始化工作
SHFILEINFO shfileinfo;
ProcessImg.Create(16,16, ILC_COLOR32, 2, 80);
HIMAGELIST hImageList = NULL;
///////////////////////////////////////////////////////////////////////
//这个就是要放到进程遍历的循环里面
//lpwzFullString为进程路径,.dll,.exe,.sys无论啥文件都可以
hImageList=(HIMAGELIST)::SHGetFileInfo(lpwzFullString,0,&shfileinfo,sizeof(shfileinfo),SHGFI_ICON);
//增加到CImagelList
ProcessImg.Add(shfileinfo.hIcon);
//m_list为列表框指针,调用CReportCtrl类中函数设置关联
m_list->SetImageList(&ProcessImg);
//i为遍历时的id,调用CReportCtrl类中函数设置关联
m_list->SetItemImage(i,0,i);
///////////////////////////////////////////////////////////////////////
简单看上去没什么问题,但是有时候会来显示内核驱动一些信息,有些是已经被删除的,没有路径,提取不到图标,有些是有。
如何做到只在有路径的地方显示图标,做到一一对应。
我的方法是在资源管理器中自己画一个白色图标,设置一个是否有路径的BOOL变量,没有路径的,在CImageList加入白色图标。
有人可能会说,可以使用CreateIcon来创建,我试过这个函数,但不知道为什么,创建黑色图标加入可以,白色图标加入CImageList失败。
也试过其它几种方法,比如如果没有路径就跳过,但总是不可以,我觉得可能是这个不允许有些加入图标,有些不加。
写出来就这些东西,但是实际来解决的时候,却没有这么简单,因为你并不清楚问题出的哪,要慢慢去测试。
如果大家有更好的方法,欢迎分享出来,一起进步。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值