我需要创建HBITMAP。
这就是问题所在。我在内存中有bmp文件的内容。
如果位图是资源,我知道如何创建HBITMAP。 但由于它存在于记忆中,我不知道该怎么做。
我这样做(如果在资源中):Link
hDC = BeginPaint(hWnd, &Ps);
// Load the bitmap from the resource
bmpExercising = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_EXERCISING));
// Create a memory device compatible with the above DC variable
MemDCExercising = CreateCompatibleDC(hDC);
// Select the new bitmap
SelectObject(MemDCExercising, bmpExercising);
// Copy the bits from the memory DC into the current dc
BitBlt(hDC, 10, 10, 450, 400, MemDCExercising, 0, 0, SRCCOPY);
// Restore the old bitmap
DeleteDC(MemDCExercising);
DeleteObject(bmpExercising);
EndPaint(hWnd, &Ps);
如果是内存资源,请指导我如何操作。
以某种方式将char img[10000]
更改为资源?
这里,img
是与位图内容相对应的内存。
答案 0 :(得分:1)
首先,让我们删除一点无辜的问题:
hDC = BeginPaint(hWnd, &Ps);
// Load the bitmap from the resource
bmpExercising = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_EXERCISING));
// Create a memory device compatible with the above DC variable
MemDCExercising = CreateCompatibleDC(hDC);
// Select the new bitmap
HOBJECT oldbmp = SelectObject(MemDCExercising, bmpExercising); //<<<<save it for later ...
// Copy the bits from the memory DC into the current dc
BitBlt(hDC, 10, 10, 450, 400, MemDCExercising, 0, 0, SRCCOPY);
// Restore the old bitmap
SelectObject(MemDCExercising, oldbmp); //<<<... DeleteDC will leak memory if it holds a resource
DeleteDC(MemDCExercising);
DeleteObject(bmpExercising);
EndPaint(hWnd, &Ps);
现在,HBITMAP(概念上讲)是一个指向内部结构的指针,该内部结构包含一个“指针”(实际上更像是一个流),它指向你无法访问的GDI内存空间。
“内存位图”未作为内存缓冲区显示在您的程序中,而是作为一个与CreateCompatibleBitmap获得的HBITMAP,其中HDC参数标识位图所具有的DC兼容。 (通常是屏幕,窗口或绘画DC)。
您可以通过包含初始数据的缓冲区来初始化初始化位图,或者使用CreateBitmap或GetBitmapBits获取位图保存的数据。
在任何情况下,这些都是位图数据的本地副本,而不是GDI引入的“实时位图”。
另请注意,这些数据的内部结构取决于位图需要具有的格式(每个像素在多少平面上有多少位,有或没有调色板),以及在Blit过程中避免性能损失,它必须与屏幕设置使用的格式一致。
这不一定必须与位图保存到“bmp”文件时的位置相同。