gpt4 book ai didi

c++ - 如何在 CBitmap 上使用透明背景的 CDC 绘制文本?

转载 作者:太空狗 更新时间:2023-10-29 21:06:28 26 4
gpt4 key购买 nike

我有下面的代码,如果你屏蔽掉粉红色像素,我真正想要的是像 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 行为不端,还是我遗漏了什么?

最佳答案

简单的 DrawText() 没有 MFC 的透明背景:

// in my case a user drawn button:
_windowHandle = CreateWindowEx(...);
SendMessage(_windowHandle, WM_SETFONT, (WPARAM)font, (LPARAM)NULL);

...

// WM_DRAWITEM
SetTextColor(hDC, RGB(216, 27, 27));
SetBkMode(hDC, TRANSPARENT);
RECT rect = { 0, 0, backgroundBitmap.bmWidth, backgroundBitmap.bmHeight };
DrawText(hDC, _text.c_str(), -1, &rect, DT_CENTER | DT_WORDBREAK);

--hfrmobile

关于c++ - 如何在 CBitmap 上使用透明背景的 CDC 绘制文本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7654958/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com