2016-10-17 13 views
3

Есть несколько других вопросов, которые очень похожи на это, что я пришел через:Получение альфа-смешивания для работы с CImageList

  1. Is it possible to create a CImageList with alpha blending transparency?
  2. Transparent images in ImageLists for ListViews
  3. 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-битный.

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

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

+0

Икона состоит из двух растровых изображений: информация изображения плюс монохромных маски. Это несовместимо с вашим выбором списка изображений ('ILC_COLOR32'). Вы не можете просто добавить данные значка в свой список изображений. Сначала вам придется преобразовать в 32-битный формат ARGB. Однако это не даст вам альфа-прозрачности. Поскольку маска монохромна, у вас есть пиксели, которые полностью прозрачны или полностью непрозрачны. – IInspectable

+0

В статье, посвященной статье MSDN, описывается использование значков.Кроме того, я знаю, что информация об изображении значка, загруженного в образец, является ARGB, подтвердив это с помощью GetBitmapBits и глядя на пиксели. Структура BITMAP также говорит, что она 32bit. – Murrgon

+0

Я пробовал ваш код в MFC, это выглядит хорошо. Отправьте несколько изображений того, что вы получаете и чего ожидаете получить. Увеличьте высоту элемента TreeView до 32 или 64, чтобы лучше понять иконки. –

ответ

4

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

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

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

Примечание это #pragma директива является Visual Studio конкретны, проявляются с другими компиляторами.

Кроме того, вы можете добавить поддержку для окон темы:

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

Результат:

enter image description here

+0

Ah HA! Это сделал трюк. Огромное спасибо. – Murrgon

 Смежные вопросы

  • Нет связанных вопросов^_^