【发布时间】:2016-01-08 14:43:47
【问题描述】:
我正在使用来自此项目 http://www.codeproject.com/Articles/9064/Yet-Another-Transparent-Static-Control 的代码,以便将透明按钮图像从我的子类 Button 控件绘制到我的 CDialogEx 上。
此代码适用于旧版 24bpp GDI 函数:
BOOL CTransparentStatic2::OnEraseBkgnd(CDC* pDC)
{
if (m_Bmp.GetSafeHandle() == NULL)
{
CRect Rect;
GetWindowRect(&Rect);
CWnd *pParent = GetParent();
ASSERT(pParent);
pParent->ScreenToClient(&Rect); //convert our corrdinates to our parents
//copy what's on the parents at this point
CDC *pDC = pParent->GetDC();
CDC MemDC;
MemDC.CreateCompatibleDC(pDC);
m_Bmp.CreateCompatibleBitmap(pDC,Rect.Width(),Rect.Height());
CBitmap *pOldBmp = MemDC.SelectObject(&m_Bmp);
MemDC.BitBlt(0,0,Rect.Width(),Rect.Height(),pDC,Rect.left,Rect.top,SRCCOPY);
MemDC.SelectObject(pOldBmp);
pParent->ReleaseDC(pDC);
}
else //copy what we copied off the parent the first time back onto the parent
{
CRect Rect;
GetClientRect(Rect);
CDC MemDC;
MemDC.CreateCompatibleDC(pDC);
CBitmap *pOldBmp = MemDC.SelectObject(&m_Bmp);
pDC->BitBlt(0,0,Rect.Width(),Rect.Height(),&MemDC,0,0,SRCCOPY);
MemDC.SelectObject(pOldBmp);
}
return TRUE;
}
但是,我的 CDialogEx 的背景是使用 GDI+ 32bpp 渲染绘制的,如下所示:
BOOL CParentDialogEx::OnEraseBkgnd(CDC* pDC)
{
// Get GDI+ Graphics for the current Device Context
Graphics gr(*pDC);
// Get the client area
CRect clientRect;
GetClientRect(&clientRect);
// Draw the dialog background
// PLEASE NOTE: m_imgDlgBkgnd is a Gdiplus::Image with PNG format ==> 32bpp Image
gr.DrawImage(m_imgDlgBkgnd, 0, 0, clientRect.Width(), clientRect.Height());
}
这会导致第一个代码 sn-p 备份黑色矩形而不是 32bpp 绘制的内容。这再次导致我的按钮控件始终具有黑色背景。
为了让我的问题更清楚,请看下面的图片:
- 按钮图像被绘制到 CDialogEx 背景上(通常):
- 正在使用第一个代码 sn-p 绘制按钮图像
如您所见,GDI 24bpp 看不到对话框背景。它只是假设纯黑色背景。只有 GDI+ 可以看到它。但是我找不到从Gdiplus::Graphics 对象获取位图的方法。
如何获得 32bpp 背景备份以正确绘制透明图像?
完全不使用备用图像会导致 GDI+ 的 alpha 混合在每次绘制时越来越模糊背景。
【问题讨论】:
标签: c++ mfc gdi+ gdi alphablending