2016-10-17 6 views
3

で動作するようにアルファブレンディングを取得、私が遭遇してきたこれと非常によく似ている他のいくつかの質問があります。 WTL9.0を使用します。私はその子としてCTreeViewCtrlExを持つフレームウィンドウを持っています。私はSHGetFileInfo()を使用してツリー内で使用したいアイコンを取得していますが、黒い背景で表示されます。ここに完全なサンプルがあります。はCImageList

#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; 
} 

上記第3のリンクは、私は、アイコンからビットマップを取得する必要があり、それのコピーを作成して、イメージリストに追加することを示唆しているようです。

しかし、this projectのコードを見ると、アイコン自体を簡単に使用できるはずです。あなたが提供されたクラスを掘り下げれば、アイコンハンドルを使ってリストに追加するだけです。この比較の問題は、C#であり、状況が異なる可能性があるということです。

This MSDN articleは、32ビットアルファブレンドアイコンがサポートされていることを示していますが、まだ動作させる必要があります。

提供されたコードにロードされたアイコンのビットマップを取得し、ピクセルデータを参照すると、画像にはアルファチャンネルと32ビットとして表示されます。

誰かがこれを動作させる方法を知っている場合は、私に啓発してもらえますか?

編集:ここに私が投稿したコードの画像があります。 TreeView with 32x32 icons

+0

アイコンが2つのビットマップで構成されています。これはあなたの選択したイメージリスト( 'ILC_COLOR32')と互換性がありません。アイコンデータをイメージリストに追加することはできません。最初に32ビットのARGBカラーフォーマットに変換する必要があります。しかし、アルファ透明度は得られません。マスクはモノクロであるため、ピクセルは完全に透明または完全に不透明です。 – IInspectable

+0

MSDNのリンク先の記事では、具体的にアイコンを使用して説明しています。また、私がサンプルにロードしたアイコンの画像情報がARGBであることを知っていて、GetBitmapBitsでピクセルを確認しています。 BITMAP構造は32ビットであるとも言います。 – 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です。

また、あなたがWindowsテーマのサポートを追加することができます。

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

結果:画像情報に加えてモノクロのマスク:

enter image description here

+0

ああ!それがトリックでした。どうもありがとうございます。 – Murrgon