hier ... Eine Abbildungsliste, wie vorgeschlagen, machen Sie Ihre Symbole in eine Bitmap, 16 Pixel hoch, um 16 * n lang, wo n = die Anzahl der Symbole ...
Setzen Sie die Hintergrundfarbe auf 255, 0, 255, wie Sie es getan haben.
Dann laden Sie es, und es in die Bildliste hinzufügen, wie ich hier tat:
m_ImageList.Create(16, 16, ILC_COLOR16 | ILC_MASK, 7, 1);
CBitmap bm;
bm.LoadBitmap(IDB_SUPERTREEICONS);
m_ImageList.Add(&bm, RGB(255, 0, 255));
GetTreeCtrl().SetImageList(&m_ImageList, TVSIL_NORMAL);
Natürlich ist dies in MFC geschrieben wurde, aber wie Sie wissen, es ist nur ein Wrapper für Win32 ..
Außerhalb von diesem müssen Sie zu einem benutzerdefinierten Zeichensteuerelement gehen, in dem Sie das Symbol über den Hintergrund zeichnen, auf dem das Symbol gerade sitzt. Es gibt keine magische "transparente" Farbe, die ich kenne, in irgendeiner dieser Steuerungen.
Im Falle eines benutzerdefinierten ziehen, müssen Sie Code verwenden, wie folgt aus:
#define TRANSPARENT_COLOR (255,0,255)
UINT iBitmap = IDB_ICON_UP
CDC *dc = GetDC();
int x = 0, y = 0;
CDC *pDisplayMemDC = new CDC;
CDC *pMaskDC = new CDC;
CDC *pMemDC = new CDC;
CBitmap *pBitmap = new CBitmap;
CBitmap *pMaskBitmap = new CBitmap;
CBitmap *pMemBitmap = new CBitmap;
int cxLogo, cyLogo;
BITMAP bm;
pBitmap->LoadBitmap(iBitmap);
pDisplayMemDC->CreateCompatibleDC(dc);
CBitmap *pOldBitmap = (CBitmap *)pDisplayMemDC->SelectObject(pBitmap);
pBitmap->GetObject(sizeof(bm), &bm);
cxLogo = bm.bmWidth;
cyLogo = bm.bmHeight;
pMaskBitmap->CreateBitmap(cxLogo, cyLogo, 1, 1, NULL);
pMaskDC->CreateCompatibleDC(dc);
CBitmap *pOldMask = (CBitmap *)pMaskDC->SelectObject(pMaskBitmap);
COLORREF oldBkColor = pDisplayMemDC->SetBkColor(TRANSPARENT_COLOR);
pMaskDC->BitBlt(0, 0, cxLogo, cyLogo, pDisplayMemDC, 0, 0, SRCCOPY);
pMemBitmap->CreateCompatibleBitmap(dc, cxLogo, cyLogo);
pMemDC->CreateCompatibleDC(dc);
CBitmap *pOldMem = (CBitmap *)pMemDC->SelectObject(pMemBitmap);
pMemDC->BitBlt(0, 0, cxLogo, cyLogo, dc, x, y, SRCCOPY);
pMemDC->BitBlt(0, 0, cxLogo, cyLogo, pDisplayMemDC, 0, 0, SRCINVERT);
pMemDC->BitBlt(0, 0, cxLogo, cyLogo, pMaskDC, 0, 0, SRCAND);
pMemDC->BitBlt(0, 0, cxLogo, cyLogo, pDisplayMemDC, 0, 0, SRCINVERT);
dc->BitBlt(x, y, cxLogo, cyLogo, pMemDC, 0, 0, SRCCOPY);
delete pMemDC->SelectObject(pOldMem);
delete pMemDC;
delete pMaskDC->SelectObject(pOldMask);
delete pMaskDC;
delete pDisplayMemDC->SelectObject(pOldBitmap);
delete pDisplayMemDC;
Dieser Code wo entscheidet das Symbol zu zeichnen, und macht eine Momentaufnahme des Hintergrunds, schafft eine Maske für die Symbol, und dann zeichnet es über den Hintergrund, so dass es einen völlig transparenten Hintergrund ...
Hoffnung, die etwas hilft. Wenn nicht, erkläre bitte ausführlicher, was du zu erreichen versuchst und was du siehst oder was du nicht siehst ...
Du hast deine Quelle irgendwo für uns zur Verfügung? Ich sehe einige Kommentare, in denen Leute Ihren Code testen. Ich würde es mir gerne ansehen, da ich in diesem Bereich viel gearbeitet habe ... – LarryF
Bitte sehen Sie meine Antwort (Antwort 2) für http: //stackoverflow.com/questions/6893351/transparent-images-in-imimelists-for-listviews/ thread. Olexiy –