首页 > 解决方案 > 使用 32bpp 位图和 alpha 混合在 CDC 上绘画

问题描述

我在将 32bpp 位图混合到内存 DC 中时遇到问题。这是我正在尝试做的事情:

结果,我看不到兼容直流上绘制的任何内容。似乎在绘制兼容 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-> compatible CDCand AlphBlend)。

我的问题是:为什么会这样?为什么我看不到绘画结果以及如何解决它?我在这里想念什么?

提前致谢

标签: c++mfc

解决方案


推荐阅读