c++ - 椭圆的透明边界框

标签 c++ winapi mfc gdi

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

enter image description here

是否包含 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);

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

最佳答案

如果在内存dc上绘图,则用透明颜色填充背景,然后使用TransparentBlt将内存 dc 传输到最终 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);

关于c++ - 椭圆的透明边界框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57561950/

相关文章:

c++ - 从 ui 文件中检索 Qwidget

windows - 阻止非管理员在特定时间段内登录 Windows

c++ - 使用 MFC 在 opencv 中的函数 cvInitImageHeader 中输入 roi 错误

c++ - 具有资源管理器主题的 CTreeCtrl 不支持 DPI

c++ - 如何从 C++ 的控制台应用程序显示 MFC 对话框?

C++:将结构插入集合时出错

c++ - std::tuple 作为模板参数?

C++ 如何使 template<T>f() 为整数 T 返回 -1,为指针类型返回 nullptr

vb.net - 如何在 VB.NET 中激活、移动和调整窗口大小

c - 为什么 GetOverlappedResult 需要文件句柄?