Получение альфа-смешивания для работы с CImageList

Есть несколько других вопросов, очень похожих на этот, с которыми я столкнулся:

  1. Можно ли создать CImageList с прозрачностью альфа-смешивания?
  2. Прозрачные изображения в ImageLists для ListViews
  3. Прозрачность ImageList в списках просмотра?

Я использую 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;
}

Третья ссылка, приведенная выше, указывает на то, что мне нужно получить растровое изображение от значка, сделать его копию и затем добавить его в список изображений.

Глядя на код для этот проект, однако, это будет означать, что вы сможете просто использовать сами значки. Если вы покопаетесь в предоставленном классе, он просто использует дескриптор значка, чтобы добавить его в список. Проблема с этим сравнением состоит в том, что это в C #, и все может быть по-другому.

Эта статья MSDN действительно означает, что поддерживаются 32-битные альфа-иконки, но я еще не заставил их работать.

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

Если кто-то знает, как заставить это работать, не могли бы вы просветить меня?

Редактировать: Вот изображение того, что я получаю с кодом, который я разместил.
TreeView с иконками 32x32

3

Решение

Код в порядке, но Windows не проинформирована об используемой версии общего элемента управления.

Вы должны включить Визуальный стиль. Вы можете сделать это в манифесте проекта или, как минимум, включить следующие строки в один из ваших * .cpp файлов:

#pragma comment(linker,"/manifestdependency:\"type='win32' \
name='Microsoft.Windows.Common-Controls' version='6.0.0.0' \
processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")

Обратите внимание на это #pragma Директива специфична для Visual Studio, используйте манифест с другими компиляторами.

Дополнительно вы можете добавить поддержку темы Windows:

#include <UxTheme.h>
#pragma comment( lib, "UxTheme.lib" )
...
SetWindowTheme(tree.m_hWnd, L"Explorer", NULL);

Результат:

введите описание изображения здесь

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]