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

时间:2017-03-15 20:34:17

标签: c++

我需要复制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);

1 个答案:

答案 0 :(得分:0)

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

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

HBITMAP创建一个bufferDC对象(您可以使用CreateCompatibleBitmap),然后在执行任何blits之前为bufferDC选择它。

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