我正试图从屏幕的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
答案 0 :(得分:1)
首先,设备上下文似乎存在混淆。你从memoryDc blit到appDc,但memoryDc不包含任何内容 - 它已被创建为与dc兼容,但这并不意味着它共享内容。此外,您不会在示例中释放DC。
其次,你对ShowWindow()的调用似乎暗示之前窗口是不可见的。如果是这种情况,之前已经“绘制”的任何内容实际上都没有被绘制,并且在窗口中不可见。捕获位图中的屏幕内容并在WM_PAINT期间显示它。
答案 1 :(得分:0)
由于您在代码块末尾为应用程序窗口调用ShowWindow
,我认为在此之前窗口不可见。
如果是这样,那么这就是你的问题,因为当一个不可见的窗口再次可见时,它的客户区总是重新绘制。这会导致其背景被该窗口的默认画笔擦除(在您的情况下显然是黑色画笔),并且您在其设备上下文(DC)中绘制的任何内容(使用BitBlt
功能)都会丢失
更好的方法是将屏幕捕获绘制到临时位图中。然后,只要保留此位图的副本,并在收到WM_PAINT
消息时将其绘制到窗口上。