【问题标题】:Transparent bounding box of an ellipse椭圆的透明边界框
【发布时间】:2019-12-24 23:32:33
【问题描述】:

我正在编写一些 C++ 代码来绘制椭圆。有时这些椭圆可以在一个分组中相互堆叠。当它们相互堆叠时,我希望椭圆的边界框是透明的,这样我就看不到边界框的白角。见下图。

是否包含SetBkMode 似乎并没有什么不同。如果我不执行FillRect,我会在边界框上看到黑色背景。


HBRUSH brush = CreateSolidBrush(RGB(255, 255, 255));
CDC *pDC = CDC::FromHandle(pSprite->hDCMem);
pDC->SetBkMode(TRANSPARENT);
pDC->FillRect(m_SpriteRect, CBrush::FromHandle(brush));
pDC->SelectObject(m_BackBrush);
pDC->Ellipse(m_SpriteRect);
pDC->SetBkMode(OPAQUE);

DeleteObject(brush);

有没有办法设置透明背景?

【问题讨论】:

  • 只需删除FillRect。看起来您正在使用内存 dc,因此根据您的操作可能会导致不同的问题。如果你是在制作精灵的话会有点复杂...
  • @Barmak 如果我不使用 FillRect,边界框背景是黑色的。至少白色背景看起来更好。
  • 显示代码的其余部分,您在最终 dc 上绘制内存 dc。尝试TransparentBlt 使用相同的颜色。
  • @Barmak - TransparentBlt 就是答案。如果您想将其发布为我的问题的答案,我会接受。

标签: c++ winapi mfc gdi


【解决方案1】:

如果在内存 dc 上绘图,请用透明颜色填充背景,然后使用TransparentBlt 将内存 dc blit 到最终的HDC。示例:

CDC *pDC = CDC::FromHandle(hDCMem);

//fill the background with transparent color
COLORREF clr_transparent = RGB(255, 255, 255); //<- randomly selected color
CBrush brush(clr_transparent);
pDC->FillRect(m_SpriteRect, &brush);

//any drawing
auto oldbrush = pDC->SelectObject(m_BackBrush);
pDC->Ellipse(m_SpriteRect);
pDC->SelectObject(oldbrush);

//transparent blit
TransparentBlt(final_hdc, x_dest, y_dest, width, height, 
    hDCMem, 0, 0, m_SpriteRect.right, m_SpriteRect.bottom, clr_transparent);

【讨论】:

  • 或者先从后台blit到内存DC。