我读过一些关于 GetDIBits 或 BitBlt 的文章,但我不理解它们。
那可能是因为我不了解 Windows 实际如何处理 Windows 上的图形。如果有人可以将我推荐给我可以了解这些事情的页面,那将是完美的!:)
我在 windows WM_PAINT 中使用此代码解决了这个问题。它现在显示与目标窗口完全相同的内容。
PAINTSTRUCT ps;
HDC hdc = BeginPaint(MainWindow, &ps);
HDC TargetDC = GetDC(TargetWindow);
RECT rect;
GetWindowRect(TargetWindow, &rect);
BitBlt(hdc,0,0,rect.right-rect.left,rect.bottom-rect.top,TargetDC,0,0,SRCCOPY);
EndPaint(MainWindow, &ps);
你想要的是:
或者,对于第 3 步,您可以使用 DWM 或使用剪贴板获取 hacky:
void CopyWndToClipboard(CWnd *pWnd)
{
CBitmap bitmap;
CClientDC dc(pWnd);
CDC memDC;
CRect rect;
memDC.CreateCompatibleDC(&dc);
pWnd->GetWindowRect(rect);
bitmap.CreateCompatibleBitmap(&dc, rect.Width(),rect.Height());
CBitmap* pOldBitmap = memDC.SelectObject(&bitmap);
memDC.BitBlt(0, 0, rect.Width(),rect.Height(), &dc, 0, 0, SRCCOPY);
pWnd->OpenClipboard() ;
EmptyClipboard() ;
SetClipboardData(CF_BITMAP, bitmap.GetSafeHandle()) ;
CloseClipboard() ;
memDC.SelectObject(pOldBitmap);
bitmap.Detach();
}
向窗口发送WM_PRINTCLIENT消息可能会带来一些运气。这可能不适用于使用 DirectX 或 OpenGL 的窗口。
在启用 Aero 的系统上使用 WM_PRINTCLIENT 可能会遇到一些问题(即当 DWM 处于活动状态时)。如果系统确实激活了 DWM,那么它可能会提供获取窗口后备存储的方法,但我之前没有深入研究过这样做。