Hier... Erstellen Sie eine ImageList, wie vorgeschlagen, machen Sie Ihre Icons in ein Bitmap, 16 Pixel hoch, mal 16*n lang, wobei n= die Anzahl der Icons...
Setzen Sie die Hintergrundfarbe auf 255, 0, 255, wie Sie es getan haben.
Laden Sie es dann, und fügen Sie es der Bilderliste hinzu, wie ich es hier getan habe:
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 wurde dies in MFC geschrieben, aber wie Sie wissen, ist es nur ein Wrapper für Win32...
Andernfalls müssen Sie ein benutzerdefiniertes Steuerelement zum Zeichnen verwenden, mit dem Sie das Symbol über einen beliebigen Hintergrund zeichnen, auf dem das Symbol gerade sitzt. Es gibt nicht wirklich eine magische "transparente" Farbe, die ich kenne, in einem dieser Steuerelemente.
Im Falle einer benutzerdefinierten Auslosung müssen Sie einen Code wie den folgenden verwenden:
#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 entscheidet, wo das Symbol gezeichnet werden soll, und macht einen Schnappschuss des Hintergrunds, erstellt eine Maske für das Symbol und zeichnet es dann über den Hintergrund, wodurch es einen vollständig transparenten Hintergrund erhält...
Ich hoffe, das hilft ein wenig. Wenn nicht, erklären Sie bitte genauer, was Sie versuchen zu erreichen, und was Sie sehen, oder was Sie NICHT sehen...
0 Stimmen
Haben Sie Ihre Quelle irgendwo zur Verfügung, damit wir damit herumspielen können? Ich sehe einige Kommentare, in denen Leute Ihren Code testen. Ich würde gerne einen Blick darauf werfen, da ich eine Menge Arbeit in diesem Bereich gemacht habe...
0 Stimmen
Bitte lesen Sie meine Antwort (Antwort 2) für stackoverflow.com/questions/6893351/ Thema. Olexiy