2017-01-11 4 views
2

Кажется, что существует ограничение на 16 прозрачных значков, которые вы можете использовать в CComboBoxEx. У меня есть следующий псевдокод:CImageList и 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, прекрасно работают. Есть идеи?

EDIT: Я использую Visual Studio 2013

+0

Сколько стоит TF_COUNT? Вы пытались вызвать 'm_ImageList.Create (16,16, ILC_COLOR32,1, TF_COUNT); вместо этого? – sergiol

+0

Почему 'DestroyIcon (phIcons [nImage]);'? – sergiol

+1

@sergiol Я создал значок с CreateIconIndirect - мне нужно его уничтожить в соответствии с https://msdn.microsoft.com/en-us/library/windows/desktop/ms648062(v=vs.85).aspx – BadJerry

ответ

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.

+0

Ты играешь с тобой! Я очень ценю вашу тщательность и вашу настойчивость! – BadJerry

+0

Спасибо :) Вы также можете принять ответ (зеленая галочка), если это поможет. – Codeguard

0

Решение 1

Если вы хотите использовать прозрачность, вам нужно создать список изображений с маской:

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

Solution 2

Другим (худшим) подходом является установка желаемого значения ba ckground цвет (после создания ImageList, но прежде чем добавлять иконки):

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); 

И у вас наверняка будут все значки неправильными.

Update 1

У меня нет никаких проблем с 16+ прозрачных иконок на моем Win8.1, так что пришло время, чтобы подозревать, что программное обеспечение сторонних производителей или ваш собственный код является корнем проблемы. Вам нужно подготовить минимальный пример кода, который все еще содержит проблему, а затем попробовать его на другом компьютере. Лучше всего попробовать на виртуальной машине (вы можете загрузить готовый один here), чтобы уменьшить все возможные риски того, что программное обеспечение, которое вы установили на многих машинах сразу. Если ваш минимальный пример все еще показывает проблему на виртуальной машине, запишите ее и поделитесь с нами.

+0

Спасибо за советы - Мне нравится, что вы основательно. Решение 1 неверно - вы не собираетесь использовать ILC_COLOR32 ILC_MASK вместе ... и просто ILC_COLOr32 прекрасно работает в элементе управления списком Решение 2: Я добавил 20-кратный значок: первые 16 в порядке - 17 th on нет - есть волшебное число 16 для CombBoxEx :) Трудно поверить, что я знаю – BadJerry

+0

Не знаете, почему вы думаете, что 'ILC_COLOR32'' ILC_MASK' не будут использоваться вместе. MSDN ничего не говорит об этом, и в моем собственном примере, где я загружаю 24-битную иконку 'ILC_MASK', решает черный фон. Кроме того, у меня нет проблем с 16 на моих окнах 8.1. См. Обновление. – Codeguard

+0

Вы похожи на St Thomas;) Я сделал то, что вы предложили, небольшой образец, виртуальную машину с гипер-g, и я получаю только 16 прозрачных значков ... Проверьте код здесь: https://db.tt/ewe3wsQ7gQ – BadJerry