创建双缓冲GDI桌面覆盖层时出现黑屏带红线问题求助
问题分析与解决
你的代码出现黑屏加红线的核心原因是:CreateCompatibleBitmap 创建的位图初始为纯黑色,你直接在这个黑位图上画线后,用 BitBlt 把整个黑位图覆盖到桌面DC上,自然会把原有桌面内容替换成黑底,只保留红线。
修复方案
要实现“在桌面上方叠加绘制内容”的效果,需要先把当前桌面的内容复制到内存DC的位图中,再在这个包含桌面内容的内存DC上绘制红线,最后将内存DC的内容回写到桌面DC。
修改后的代码如下:
HDC hdc = GetDC(0); HDC mem_handle = CreateCompatibleDC(hdc); HBITMAP bitmap_hndl = CreateCompatibleBitmap(hdc, 1920, 1080); HBITMAP old0 = (HBITMAP)SelectObject(mem_handle, bitmap_hndl); // 关键步骤:先将桌面内容复制到内存DC BitBlt(mem_handle, 0, 0, 1920, 1080, hdc, 0, 0, SRCCOPY | CAPTUREBLT); HPEN pen = CreatePen(PS_SOLID, 5, RGB(255, 0, 0)); HGDIOBJ oldpen = SelectObject(mem_handle, pen); POINT Dots[2]; Dots[0] = { 500, 500 }; Dots[1] = { 200, 200 }; DWORD NumDots = 2; PolyPolyline(mem_handle, Dots, &NumDots, 1ull); // 将包含桌面+红线的内存DC内容回写到桌面 BitBlt(hdc, 0, 0, 1920, 1080, mem_handle, 0, 0, SRCCOPY); SelectObject(mem_handle, oldpen); SelectObject(mem_handle, old0); DeleteObject(pen); DeleteObject(bitmap_hndl); DeleteDC(mem_handle); ReleaseDC(0, hdc);
额外说明
- 你之前尝试的
AlphaBlend和TransparentBlt无法解决问题,是因为根本问题不是透明处理,而是内存DC没有预先捕获桌面内容,导致绘制的内容覆盖了原有桌面。 - 如果需要实现半透明的覆盖层,可以改用
CreateDIBSection创建带Alpha通道的位图,在内存DC中绘制半透明内容后,通过AlphaBlend输出到桌面DC。
内容的提问来源于stack exchange,提问作者kiiiiiiiiiiiiiiiiiiiilmepls
相关产品推荐
相关产品推荐

