如何在WinGDI / C++中复制HDC内容
How to copy HDC content in WinGDI / 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);
当你调用CreateCompatibleDC
函数时,它将创建所谓的"内存DC"对象。默认情况下,内存 DC 不会附加任何图像数据(实际上 id 有,1x1 单色位图,这不是您想要的(。
你确实为你的imageDC
选择一个位图对象,但你没有为你的bufferDC
选择任何位图对象,这就是为什么"位无处可去"。
为bufferDC
创建一个HBITMAP
对象(您可以使用CreateCompatibleBitmap
(并在对其执行任何位之前为bufferDC
选择它。
请记住一件事:DC
对象是可以绘制的内容的接口,但它本身不包含任何位图数据。
相关文章:
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 使用strcpy将char数组的元素复制到另一个数组
- 是否可以初始化不可复制类型的成员变量(或基类)
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- C++ Windows 驱动程序MSB3030无法复制该文件,因为它找不到
- 复制列表初始化的隐式转换的等级是多少
- 当从函数参数中的临时值调用复制构造函数时
- 有可能在Armadillo中复制MATLAB circshift方法吗
- 复制几乎为空的数组的最快方法
- 以下示例中如何避免代码复制?C++/库达
- 如果有一个模板构造函数只有一个泛型参数,为什么我必须有一个复制构造函数
- 为什么需要复制构造函数,在哪些情况下它们非常有用
- 不能将复制初始化与隐式转换的多个步骤一起使用
- 当有分配器意识的容器被复制/移动时,反弹分配器是否被复制/移走
- 为什么复制而不是移动数据元素?
- 文件系统:复制功能的速度秘诀是什么
- 使用仅使用一次的变量调用的复制构造函数.这可能是通过调用move构造函数进行编译器优化的情况吗
- 如何将 HDC 位图快速复制到三维阵列?
- 如何在WinGDI / C++中复制HDC内容