为什么截图没有使用SelectObject和BitBlt函数绘制到我的窗口?

时间:2011-03-31 11:14:09

标签: c windows winapi gdi bitblt

我正试图从屏幕的0x0(左上角)位置获取500x500屏幕截图并将其放在窗口中。

这是我的代码(hwnd是我的窗口句柄):

HDC appDc = GetDC(hwnd);
HDC dc = GetDC(NULL);
HBITMAP bitmap = CreateCompatibleBitmap(dc, 500, 500);
HDC memoryDc = CreateCompatibleDC(dc);
SelectObject(memoryDc, bitmap);
BitBlt(appDc, 0, 0, 500, 500, dc, 0, 0, SRCCOPY);
ShowWindow(hwnd, SW_SHOW);
SetWindowText(hwnd, _T("Window"));   

我在这里缺少什么?我在窗口内变黑,而不是屏幕截图。

修改

memoryDc更改为dc后,它才有效 以前是BitBlt(appDc, 0, 0, 500, 500, memoryDc, 0, 0, SRCCOPY); 但现在问题是SelectObject无法正常工作。我的意思是它没有将图像放在HBITMAP中。但BitBlt正在从dc复制到appDc

2 个答案:

答案 0 :(得分:1)

首先,设备上下文似乎存在混淆。你从memoryDc blit到appDc,但memoryDc不包含任何内容 - 它已被创建为与dc兼容,但这并不意味着它共享内容。此外,您不会在示例中释放DC。

其次,你对ShowWindow()的调用似乎暗示之前窗口是不可见的。如果是这种情况,之前已经“绘制”的任何内容实际上都没有被绘制,并且在窗口中不可见。捕获位图中的屏幕内容并在WM_PAINT期间显示它。

答案 1 :(得分:0)

由于您在代码块末尾为应用程序窗口调用ShowWindow,我认为在此之前窗口可见。

如果是这样,那么这就是你的问题,因为当一个不可见的窗口再次可见时,它的客户区总是重新绘制。这会导致其背景被该窗口的默认画笔擦除(在您的情况下显然是黑色画笔),并且您在其设备上下文(DC)中绘制的任何内容(使用BitBlt功能)都会丢失

更好的方法是将屏幕捕获绘制到临时位图中。然后,只要保留此位图的副本,并在收到WM_PAINT消息时将其绘制到窗口上。