CImageList和CComboBoxEx限制为16个透明图标

时间:2017-01-11 15:02:35

标签: c++ mfc

似乎您可以在CComboBoxEx中使用16个透明图标。我有以下伪代码:

m_ImageList.Create(16,16,ILC_COLOR32,TF_COUNT,1);

for (int nImage = 0; nImage < TF_COUNT; nImage++)
{
    m_ImageList.Add(phIcons[nImage]);
    DestroyIcon(phIcons[nImage]);
}
m_cmbAction.SetImageList(&m_ImageList);

前16个图标都可以 - 以下都有黑色背景而不是透明度。与CTreeCtrl或CListCtrl相关联的相同代码和图像列表工作得很漂亮。有什么想法吗?

编辑:我使用的是Visual Studio 2013

2 个答案:

答案 0 :(得分:1)

作者在ZIP文件中发布了他的代码:

m_ImageList.Create(16, 16, ILC_COLOR32, TF_COUNT, 1);

for (int nIcon=0; nIcon < TF_COUNT; nIcon++)
{
    m_ImageList.Add(m_hIcon);
}
m_ComboBox.SetImageList(&m_ImageList);

COMBOBOXEXITEM cbi;
cbi.mask = CBEIF_IMAGE | CBEIF_INDENT | CBEIF_OVERLAY |
    CBEIF_SELECTEDIMAGE | CBEIF_TEXT | CBEIF_LPARAM;
int nItemCount = 0;


for (int nText = 0; nText < TF_COUNT; nText++)
{
    CString strItem;
    strItem.Format(_T("Item %d"),nText);
    cbi.iItem = nItemCount;
    cbi.pszText = (LPTSTR)(LPCTSTR)strItem;
    cbi.cchTextMax = strItem.GetLength();
    cbi.iImage = nText;
    cbi.iSelectedImage = nText;
    cbi.iOverlay = nText;
    cbi.iIndent = 0;
    cbi.lParam = nText;
    m_ComboBox.InsertItem(&cbi);
    nItemCount++;
}

在此代码中,错误为CBEIF_OVERLAYcbi.iOverlay = nText。叠加图像是在另一个图像上透明绘制的图像(这样,您可以组合两个图标)。在作者的代码中,这显然不是意图。

最后,图片列表允许only up to 15 overlay icons。这解释了魔术16。

答案 1 :(得分:0)

解决方案1 ​​

如果要使用透明度,则需要使用蒙版创建图像列表:

m_ImageList.Create(16, 16, ILC_COLOR32 | ILC_MASK, TF_COUNT, 1)

解决方案2

另一种(更糟糕的)方法是设置所需的背景颜色(在创建图像列表之后,但在添加图标之前):

m_ImageList.SetBkColor(RGB(0xFF, 0xFF, 0xFF))

背景颜色的问题在于您必须确定要使用的背景颜色。

幻数16

我不认为你的问题是CComboBoxEx以某种方式遇到数字16的问题。相反,我认为你的图标有点不同,例如一些真​​正的32位,一些是其他格式。你可以这样测试:

m_ImageList.Create(16,16,ILC_COLOR32,TF_COUNT,1);

for (int nImage = 0; nImage < TF_COUNT; nImage++)
{
    m_ImageList.Add(phIcons[0]);
}

m_cmbAction.SetImageList(&m_ImageList);

此代码多次添加相同的图标。我打赌你不会遇到任何问题。现在,你也可以试试这个:

m_ImageList.Create(16,16,ILC_COLOR32,TF_COUNT,1);

for (int nImage = 0; nImage < TF_COUNT; nImage++)
{
    m_ImageList.Add(phIcons[16]);
}

m_cmbAction.SetImageList(&m_ImageList);

你可能会把所有的图标都搞错了。

更新1

我的Win8.1上有16个以上透明图标没有任何问题,所以现在是时候怀疑第三方软件或您自己的代码是问题的根源。您需要准备一个仍包含问题的代码的最小示例,然后在另一台计算机上尝试。最好尝试使用虚拟机(您可以下载预先构建的here)以减少您在许多计算机上安装的任何软件的所有可能风险。如果您的最小示例仍显示虚拟机上的问题,请将其压缩并与我们共享。