【发布时间】:2011-10-04 22:54:56
【问题描述】:
我有以下代码,如果你屏蔽掉粉红色像素,我真正想要的是像 PNG 文件这样的透明位,这样我就可以避免 alpha 混合问题,并且需要在位图的任何地方屏蔽特定颜色将被使用。
CClientDC dc(pWnd);
CDC memDC;
if(!memDC.CreateCompatibleDC(&dc))
return NULL;
CRect bitmapRect;
bitmapRect.SetRectEmpty();
CFont* pOldFont = memDC.SelectObject(pWnd->GetFont());
CSize fontSize = memDC.GetTextExtent(imageText);
bitmapRect.right = fontSize.cx;
bitmapRect.bottom = fontSize.cy;
CBitmap bitmap;
if(!bitmap.CreateCompatibleBitmap(&dc, bitmapRect.Width(), bitmapRect.Height()))
return NULL;
CBitmap* pOldMemDCBitmap = memDC.SelectObject(&bitmap);
memDC.FillSolidRect(&bitmapRect, RGB(255,0,255));
//memDC.SetBkMode(TRANSPARENT); // doesn't work
//memDC.SetBkColor(TRANSPARENT); // doesn't work
memDC.SetTextColor(GetSysColor(COLOR_WINDOWTEXT));
//memDC.DrawText(imageText, bitmapRect, DT_TOP|DT_LEFT|DT_NOCLIP); // same difference
memDC.TextOut(0, 0, imageText);
memDC.SelectObject(pOldMemDCBitmap);
memDC.SelectObject(pOldFont);
memDC.DeleteDC();
CImageList bmImage;
bmImage.Create(bitmapRect.Width(), bitmapRect.Height(), ILC_COLOR32|ILC_MASK, 0, 1);
// this masks out the pink but for some windows blends edges of text causing pink text instead of black!
bmImage.Add(&bitmap, RGB(255,0,255));
是否只是 MFC 行为不端的充满错误的野兽,还是我遗漏了什么?
【问题讨论】:
-
IIRC
SetBkMode(TRANSPARENT)应该可以解决问题。您没有任何机会只尝试将该行与随后对SetBkColor(TRANSPARENT)的调用结合起来(它可能会将常量 TRANSPARENT 解释为某个颜色值,并可能覆盖透明度模式)...? -
不,这些是相互排斥的,只是我尝试过的事情的残余......我想我刚刚发现了我的问题,但在更新或发布答案之前进行了测试。
标签: c++ mfc bitmap transparency