我在将32bpp位图混合到内存DC中时遇到问题。这是我想要做的:
CMemDC
创建CPaintDC
CDC
和32bpp位图AlphaBlend
兼容的DC转换为CMemDC
结果,我看不到任何在兼容DC上绘制的内容。似乎在绘制了兼容直流的所有像素后,alpha值= 0。
下面是一个简化的小例子,它再现了问题:
void CTestDlg::OnPaint()
{
CPaintDC paintDC(this);
CRect rect;
GetClientRect(&rect);
// Create memory DC
CMemDC memDC(paintDC, rect);
CDC* pMemDC = &memDC.GetDC();
pMemDC->FillSolidRect(rect, RGB(128, 128, 128)); // Fill with a gray background
// Create yet another memory dc and 10x10 bitmap
CRect bmpRect(0, 0, 10, 10);
CDC bmpDC;
bmpDC.CreateCompatibleDC(pMemDC);
CBitmap bmp;
bmp.CreateCompatibleBitmap(pMemDC, bmpRect.Width(), bmpRect.Height());
CBitmap* pOldBmp = (CBitmap*)bmpDC.SelectObject(&bmp);
// At this poing all bitmap pixels have alpha = 255
bmpDC.FillSolidRect(&bmpRect, RGB(255, 0, 0)); // Draw red rectangle
// ISSUE: But here alpha = 0
//AlphaBlend into memory DC
BLENDFUNCTION bf = { AC_SRC_OVER , 0, 255, AC_SRC_ALPHA };
pMemDC->AlphaBlend(100, 100, bmpRect.Width(), bmpRect.Height(),
&bmpDC, 0, 0, bmpRect.Width(), bmpRect.Height(), bf);
// Neither memDC nor paintDC have red rectangle drawn at [100;100]
bmpDC.SelectObject(pOldBmp);
}
注意:我不能只画一张DC。原始的代码库要大得多,我需要坚持这种方法(CPaintDC
-> CMemDC
->兼容的CDC
和AlphBlend
)。
我的问题是:为什么会发生?为什么看不到绘画结果,怎么解决?我在这里想念什么?
预先感谢