似乎您可以在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
答案 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_OVERLAY
和cbi.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)以减少您在许多计算机上安装的任何软件的所有可能风险。如果您的最小示例仍显示虚拟机上的问题,请将其压缩并与我们共享。