使用32bpp位图和alpha混合在CDC上绘画

时间:2019-07-04 13:15:28

标签: c++ mfc

我在将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->兼容的CDCAlphBlend)。

我的问题是:为什么会发生?为什么看不到绘画结果,怎么解决?我在这里想念什么?

预先感谢

0 个答案:

没有答案