1> hBufferObject = CreateFileMapping(
(HANDLE)0xFFFFFFFF,
NULL,
PAGE_READWRITE,
0,
size//图像数据大小,
NULL);
2>lpvBuffer = MapViewOfFile(hBufferObject, FILE_MAP_ALL_ACCESS, 0, lBufferOffset, size);
3>hbmInput = CreateDIBSection(
hdcCompatInput,
(LPBITMAPINFO)vSrc->getDecompressedFormat(),
DIB_RGB_COLORS,
&lpvInput,
hBufferObject,//内存映射文件句柄
0
)
是不是CreateDIBSection时,如果指定了文件映射对象就不用另外开缓冲区了?如果该方法还另外还缓冲区,那要文件映射对象干什么,但问题是MapViewOfFile返回的指针和CreateDIBSection返回的指针不一样,那么究竟指向图像数据的指针是哪一个,怎么样通过内存文件映射对象把图像数据拷到hdcCompatInput的缓冲区中去再通过BITBLT显示。
(HANDLE)0xFFFFFFFF,
NULL,
PAGE_READWRITE,
0,
size//图像数据大小,
NULL);
2>lpvBuffer = MapViewOfFile(hBufferObject, FILE_MAP_ALL_ACCESS, 0, lBufferOffset, size);
3>hbmInput = CreateDIBSection(
hdcCompatInput,
(LPBITMAPINFO)vSrc->getDecompressedFormat(),
DIB_RGB_COLORS,
&lpvInput,
hBufferObject,//内存映射文件句柄
0
)
是不是CreateDIBSection时,如果指定了文件映射对象就不用另外开缓冲区了?如果该方法还另外还缓冲区,那要文件映射对象干什么,但问题是MapViewOfFile返回的指针和CreateDIBSection返回的指针不一样,那么究竟指向图像数据的指针是哪一个,怎么样通过内存文件映射对象把图像数据拷到hdcCompatInput的缓冲区中去再通过BITBLT显示。
{
int size = 200 * 200 * 32;
HANDLE hMap
= CreateFileMapping(
INVALID_HANDLE_VALUE,
NULL,
PAGE_READWRITE,
0,
size,//图像数据大小,
NULL);// LPVOID pBuffer = MapViewOfFile(hMap, FILE_MAP_ALL_ACCESS, 0, 0, 0);
HDC hdc = GetWindowDC(NULL); LPVOID pbits = NULL;
BITMAPINFO bi;
memset(&bi, 0, sizeof(bi)); bi.bmiHeader.biBitCount = 32;
bi.bmiHeader.biClrImportant = 0;
bi.bmiHeader.biClrUsed = 0;
bi.bmiHeader.biCompression = 0;
bi.bmiHeader.biHeight = 200;
bi.bmiHeader.biPlanes = 1;
bi.bmiHeader.biSize = sizeof(bi);
bi.bmiHeader.biSizeImage = 0;
bi.bmiHeader.biWidth = 200;
bi.bmiHeader.biXPelsPerMeter= 0;
bi.bmiHeader.biYPelsPerMeter= 0; HBITMAP hbm = CreateDIBSection(
hdc,
&bi,
DIB_RGB_COLORS,
&pbits,
hMap,//内存映射文件句柄
0
); HDC hCompDC = CreateCompatibleDC(hdc);
SelectObject(hCompDC, hbm); // 这句完成后, 屏幕左上角会有一块黑色的色块 :)
// 不过可能会很块残缺以至没有了
BitBlt(hdc, 0, 0, 200, 200, hCompDC, 0, 0,SRCCOPY);
DeleteObject(hbm);
ReleaseDC(NULL, hdc);
DeleteDC(hCompDC);
CloseHandle(hMap);
// UnmapViewOfFile(pBuffer);}