1

我不确定当我向 CListCtrl(或列表视图控件)添加图标时为什么会出现这个黑色轮廓?

在此处输入图像描述

我这样加载它:

//HICON hIcon;
LoadIconWithScaleDown(theApp.m_hInstance, MAKEINTRESOURCE(Icon_ID), 15, 15, &hIcon);

然后我这样创建我的图像列表:

//CImageList iml;
iml.Create(15, 15, ILC_COLOR32, numberIcons, 0);
iml.Add(hIcon);

首先准备列表视图:

//CListCtrl lst;
lst.SetExtendedStyle(LVS_EX_DOUBLEBUFFER | LVS_EX_FULLROWSELECT | 
    LVS_EX_LABELTIP | LVS_EX_HEADERDRAGDROP | LVS_EX_SUBITEMIMAGES);
lst.ModifyStyle(0, LVS_SHOWSELALWAYS);

并且图标显示在列表的子项中,如下所示:

int nInd = lst.InsertItem(c, L"Main label");

lst.SetItem(nInd, nSubitemIndex, LVIF_TEXT | LVIF_IMAGE, L"2 files", nIconInd, 0, 0, 0);

那么我做错了什么?

PS。我在我的 Windows 8.1 上使用 32 位 trucolor 显示设置运行了这个测试。

图标本身虽然是 256 色图像,因为我认为没有任何理由在具有 alpha 通道的 32 位图标上浪费空间,以实现如此小的尺寸和简单的设计:

在此处输入图像描述

4

3 回答 3

2

LVS_EX_FULLROWSELECT在 XP 上存在透明度问题,您可能会遇到这种情况。您可能必须将图像所有者绘制到列表视图上以保持透明度。或者,将图像加载到一个图像列表中,然后将具有与列表视图颜色匹配的背景颜色的图像副本渲染到单独的图像列表,然后将第二个图像列表与列表视图一起使用。

于 2014-06-17T17:42:11.817 回答
2

也许现在桥下有水,但我在有问题的图像列表上发现了 8 位的颜色深度设置。将其设置为 32 会导致透明度按预期工作......

于 2017-02-23T12:48:05.263 回答
0

在此处检查此线程 Getting alpha blending to work with CImageList

将这一行添加到一个 C++ 文件就可以了:

enter code here
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")

甚至不要问...但是我花了很长时间才发现

于 2017-01-09T22:03:40.720 回答