You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

创建双缓冲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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 22:05:03