0

我读过一些关于 GetDIBits 或 BitBlt 的文章,但我不理解它们。

那可能是因为我不了解 Windows 实际如何处理 Windows 上的图形。如果有人可以将我推荐给我可以了解这些事情的页面,那将是完美的!:)

4

3 回答 3

3

我在 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);
于 2013-01-18T20:43:24.407 回答
0

你想要的是:

  1. 获取您想要像素的窗口的 HWND。
  2. 创建一个正确大小的内存 DC(检查一下)。
  3. 在提供内存 DC 的同时将 WM_PRINTCLIENT 或 WM_PAINT 发送到窗口(尽管并非所有控件/窗口都实现了这一点)
  4. 将内存 DC 的内容复制到屏幕

或者,对于第 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();
}
于 2013-01-18T06:28:11.683 回答
0

向窗口发送WM_PRINTCLIENT消息可能会带来一些运气。这可能不适用于使用 DirectX 或 OpenGL 的窗口。

在启用 Aero 的系统上使用 WM_PRINTCLIENT 可能会遇到一些问题(即当 DWM 处于活动状态时)。如果系统确实激活了 DWM,那么它可能会提供获取窗口后备存储的方法,但我之前没有深入研究过这样做。

于 2013-01-17T20:00:43.560 回答