Есть несколько других вопросов, которые очень похожи на это, что я пришел через:Получение альфа-смешивания для работы с CImageList
- Is it possible to create a CImageList with alpha blending transparency?
- Transparent images in ImageLists for ListViews
- ImageList Transparency on Listviews?
Я используя WTL9.0. У меня есть окно кадра с CTreeViewCtrlEx в качестве его дочернего элемента. Я использую SHGetFileInfo(), чтобы получить значки, которые я хочу использовать в дереве, но они отображаются с черным фоном. Вот полный образец.
#define WINVER 0x0601 // Windows 7
#define _WIN32_WINNT 0x0601 // Windows 7
#include <atlbase.h>
#include <atlapp.h>
CAppModule g_AppModule; // WTL version of CComModule
#include <atlwin.h>
#include <atlframe.h>
#include <atlcrack.h>
#include <atlctrls.h>
class MainWnd : public CFrameWindowImpl<MainWnd>
{
private:
typedef MainWnd ThisClass;
typedef CFrameWindowImpl<MainWnd> BaseClass;
static const DWORD TREE_STYLE = TVS_HASLINES | TVS_LINESATROOT |
TVS_HASBUTTONS | WS_CHILD | WS_VISIBLE;
CTreeViewCtrlEx m_Tree;
CImageList m_ImgList;
public:
BEGIN_MSG_MAP(ThisClass)
MSG_WM_CREATE(OnCreate)
MSG_WM_DESTROY(OnDestroy)
CHAIN_MSG_MAP(BaseClass)
END_MSG_MAP()
LRESULT OnCreate(CREATESTRUCT* pCreateStruct)
{
// Create the tree control
LPCTSTR TREE_CLASS = CTreeViewCtrlEx::GetWndClassName();
m_Tree.Create(*this, rcDefault, TREE_CLASS, TREE_STYLE);
m_hWndClient = m_Tree;
// Create the image list
m_ImgList.Create(32, 32, ILC_COLOR32, 1, 1);
SHFILEINFO sFileInfo = { 0 };
const UINT FLAGS = SHGFI_ICON | SHGFI_USEFILEATTRIBUTES;
LPCTSTR PATH = _T("C:\\Windows");
// Get the directory icon
if (0 != ::SHGetFileInfo(PATH, FILE_ATTRIBUTE_DIRECTORY, &sFileInfo,
sizeof(SHFILEINFO), FLAGS))
{
CIcon dirIcon(sFileInfo.hIcon);
m_ImgList.AddIcon(dirIcon);
}
m_Tree.SetImageList(m_ImgList);
// Insert three items into the tree
CTreeItem rootItem =
m_Tree.InsertItem(_T("Root"), 0, 0, TVI_ROOT, TVI_LAST);
m_Tree.InsertItem(_T("Sub1"), 0, 0, rootItem, TVI_LAST);
m_Tree.InsertItem(_T("Sub2"), 0, 0, rootItem, TVI_LAST);
m_Tree.Expand(rootItem);
SetMsgHandled(false);
return 0;
}
void OnDestroy()
{
if (m_Tree.IsWindow())
m_Tree.DestroyWindow();
m_ImgList.Destroy();
SetMsgHandled(false);
}
};
int __stdcall WinMain
(
HINSTANCE hInstance,
HINSTANCE /*hPrevInstance*/,
LPTSTR /*wzCmdLine*/,
int nCmdShow
)
{
g_AppModule.Init(nullptr, hInstance);
MainWnd mainWindow;
MSG msg = { 0 };
if (nullptr == mainWindow.CreateEx())
return 1;
mainWindow.ShowWindow(nCmdShow);
mainWindow.UpdateWindow();
while (0 < ::GetMessage(&msg, nullptr, 0, 0))
{
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
g_AppModule.Term();
return 0;
}
Третье звено выше, кажется, предполагает, что я должен был бы получить растровое изображение с помощью значка, сделайте копию, а затем добавить его в список изображений.
Если посмотреть на код для this project, это означало бы, что вы должны просто использовать сами значки. Если вы вникнете в предоставленный класс, просто используйте значок значка, чтобы добавить его в список. Проблема с этим сравнением заключается в том, что он находится в C#, и все может быть другим.
This MSDN article указывает, что поддерживаются 32-битные альфа-иконы, но мне еще нужно заставить их работать.
Я получил растровые изображения для значка, загруженного в предоставленный код и просматривающего данные пикселя, изображение содержит альфа-канал, а также отображается как 32-битный.
Если кто-то знает, как заставить это работать, не могли бы вы просветить меня?
Редактировать: Вот изображение того, что я получаю с кодом, который я опубликовал.
Икона состоит из двух растровых изображений: информация изображения плюс монохромных маски. Это несовместимо с вашим выбором списка изображений ('ILC_COLOR32'). Вы не можете просто добавить данные значка в свой список изображений. Сначала вам придется преобразовать в 32-битный формат ARGB. Однако это не даст вам альфа-прозрачности. Поскольку маска монохромна, у вас есть пиксели, которые полностью прозрачны или полностью непрозрачны. – IInspectable
В статье, посвященной статье MSDN, описывается использование значков.Кроме того, я знаю, что информация об изображении значка, загруженного в образец, является ARGB, подтвердив это с помощью GetBitmapBits и глядя на пиксели. Структура BITMAP также говорит, что она 32bit. – Murrgon
Я пробовал ваш код в MFC, это выглядит хорошо. Отправьте несколько изображений того, что вы получаете и чего ожидаете получить. Увеличьте высоту элемента TreeView до 32 или 64, чтобы лучше понять иконки. –