获取alpha混合以使用CImageList

还有其他几个与我所遇到的非常相似的问题:

  1. 是否有可能创build一个与Alpha混合透明的CImageList?
  2. ListViews的ImageLists中的透明图像
  3. ListList上的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位alpha混合图标,但我还没有让他们工作。

我已经获得了在所提供的代码中加载的图标的位图,并查看像素数据,图像确实包含一个alpha通道以及被列为32位。

如果有人知道如何解决这个问题,可否请赐教?

编辑:这是我所发布的代码的图像。 TreeView与32x32图标

Solutions Collecting From Web of "获取alpha混合以使用CImageList"

代码是好的,但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); 

结果:

在这里输入图像说明