Как я могу добавить несколько значков к отдельному элементу TreeView?

#c #windows #winapi #mfc #treeview

#c #Windows #winapi #mfc #просмотр дерева

Вопрос:

Я пытаюсь отобразить несколько значков для элемента Treeview, но он отображает не все значки, а только один. Я использую следующий код:

 CImageList m_imageState;
m_cTree.m_imageState.Create(16, 16, ILC_MASK, 0, 4);
m_cTree.m_imageState.Add(amp;bm, RGB(255,255,0));
m_cTree.m_imageState.Add(amp;bm2, RGB(255,0,255));
m_cTree.m_imageState.Add(amp;bm, RGB(255,255,0));
m_cTree.m_imageState.Add(amp;bm1, RGB(0,255,255));
m_cTree.SetImageList( amp;(m_cTree.m_imageState), TVSIL_NORMAL ); 
  

Но когда я вижу Treeview, элемент отображает только один значок.
Возможно ли отображать несколько значков с помощью элемента Treeview?

Пожалуйста, подскажите, как я могу это сделать.

Ответ №1:

Правильно, для каждого элемента в TreeView элементе управления будет отображаться только один значок. Это сделано специально, жесткое ограничение встроенного элемента управления, который включает библиотека MFC.

Единственный способ, которым вы сможете отображать несколько значков для каждого элемента, — это рисование владельца. Это довольно сложная задача для TreeView элемента управления, далеко не такая простая, как рисование владельцем кнопки или элемента управления label. Убедитесь, что вам действительно нужна эта функциональность, и подумайте, есть ли лучший способ отображения соответствующей информации для ваших пользователей.

В качестве альтернативы вы могли бы создавать пользовательские растровые изображения, которые объединяют несколько изображений рядом друг с другом, и добавлять их в свой ImageList . Результирующие изображения будут шире, чем в высоту, но элементу управления все равно: он будет отображать изображения любого размера, который вы укажете, при условии, что все изображения в списке изображений имеют одинаковые размеры. Это определенно взлом, но он может сработать, в зависимости от ваших потребностей.

Комментарии:

1. Спасибо за ответ… В моем случае растровые изображения — это разные значки, поэтому я не думаю, что смогу объединить несколько изображений рядом друг с другом. Поэтому я думаю, что мне нужно отказаться от плана отображения нескольких изображений.

2. @Nikhil: Ну, вы можете нарисовать отдельные значки в виде растрового изображения в памяти, а затем загрузить это растровое изображение в ImageList . Это работало бы нормально, если бы вам не нужно было менять отображаемые значки очень часто. Например, вы могли бы просто нарисовать 3 значка размером 16×16 рядом друг с другом в новом растровом изображении памяти при первой загрузке вашего приложения, создав растровое изображение размером 48×16, а затем назначить это растровое изображение ImageList . Но да, если у вас это не работает, я бы определенно отказался. Я не могу представить ситуацию, когда владельцу стоило бы нарисовать TreeView только для того, чтобы получить несколько значков.

3. Мой Treeview может содержать элементы в тысячах, и значки могут отличаться для каждого элемента Treeview. Итак, в этом сценарии я чувствую, что рисование изображения в новом растровом изображении памяти было бы дорогостоящей операцией??