c++ - 使用 32bpp 位图和 alpha 混合在 CDC 上绘画
问题描述
我在将 32bpp 位图混合到内存 DC 中时遇到问题。这是我正在尝试做的事情:
CMemDC
根据创建CPaintDC
- 创建兼容
CDC
的 32bpp 位图 - 借鉴兼容的直流电
AlphaBlend
兼容直流成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
-> compatible CDC
and AlphBlend
)。
我的问题是:为什么会这样?为什么我看不到绘画结果以及如何解决它?我在这里想念什么?
提前致谢
解决方案
推荐阅读
- c# - 聚合来自两个不同数据库上下文的数据
- matlab - 如何通过插值从一对图像中制作中间图像
- database - Neo4j DBMS 能否将所有帐户和/或帐户类型的每个用户的并发会话数限制为组织定义的数量?
- java - Android Studio:应用程序在切换活动时崩溃
- wordpress - 在结帐时编辑 Woocommerce 订阅开始日期 + 频率
- android - flutter Google maps eroor:找不到providerinstaller的本地模块描述符类
- python - Django:使用`._meta.get_fields()`时如何排除相关字段?
- java - 同步执行 @PreUpdate JPA 侦听器
- r - ggplot:仅显示一次填充的图例
- android - Android Google Map CircleOptions Circles Show's Weird Lines with Circle