如何在WinGDI / C++中复制HDC内容

How to copy HDC content in WinGDI / C++

本文关键字:复制 HDC 内容 C++ WinGDI      更新时间:2023-10-16

我需要复制HDC内容,但我的代码不起作用 - 任何想法为什么?一切都很好,直到我尝试在HDC对象之间复制。似乎比特无处可去。我是GDI编程的新手。

我不确定SelectObject应该如何在这里工作。

PAINTSTRUCT ps;
HDC paintDC = BeginPaint(hWnd, &ps);
HDC imageDC = ::CreateCompatibleDC(paintDC);
HDC bufferDC = ::CreateCompatibleDC(paintDC);
BITMAPINFO bitmapInfo;
memset ( &bitmapInfo, 0, sizeof(BITMAPINFOHEADER) );
bitmapInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
int scanLines = GetDIBits(imageDC,      // handle to DC
                          m_bitmap,         // handle to bitmap
                          0,                // first scan line to set
                          0,                // number of scan lines to copy
                          NULL,             // array for bitmap bits
                          &bitmapInfo,      // bitmap data buffer
                          DIB_RGB_COLORS ); // RGB or palette index
// Paint the bitmap image.
HBITMAP pOldBitmap = (HBITMAP)SelectObject( imageDC, m_bitmap );
int width = bitmapInfo.bmiHeader.biWidth;
int height = bitmapInfo.bmiHeader.biHeight;
// Copy imageDC to bufferDC
BitBlt(bufferDC, 0, 0,
        width, height,
        imageDC, 0, 0, SRCCOPY) ;   

BitBlt(paintDC, 0, 0,
       width, height, 
       imageDC, 0, 0, SRCCOPY);
SelectObject(imageDC, pOldBitmap);

当你调用CreateCompatibleDC函数时,它将创建所谓的"内存DC"对象。默认情况下,内存 DC 不会附加任何图像数据(实际上 id 有,1x1 单色位图,这不是您想要的(。

你确实为你的imageDC选择一个位图对象,但你没有为你的bufferDC选择任何位图对象,这就是为什么"位无处可去"。

bufferDC创建一个HBITMAP对象(您可以使用CreateCompatibleBitmap(并在对其执行任何位之前为bufferDC选择它。

请记住一件事:DC对象是可以绘制的内容的接口,但它本身不包含任何位图数据。