hBitmap = CreateDIBSection()出错
我使用这个function来显示bitmap,然后
HBITMAP hBitmap;
这个宣告在Doc.h档里面
在Doc.cpp里面实作,程式码如下
void* pBits;
HDC hDC = CreateCompatibleDC(NULL);
hBitmap = CreateDIBSection(hDC,(BITMAPINFO*)bmpinfo,DIB_RGB_COLORS,&pBits,NULL,0);
SetDIBits(hDC,hBitmap,0,240,frame,(BITMAPINFO*)bmpinfo,DIB_RGB_COLORS);
每次程式执行到这一行hBitmap = CreateDIBSection(....)的时候都会出现下面这一行的错误警告:
於 0x00426566 的 MenuFace.exe 中发生未处理的例外状况: 0xC0000005: 写入位置 0xcdcdcea5 时发生存取违规。
想不出来为什么会错,我用MDI的方式。一样的方法我开新的专案用SDI就不会有此错误且bitmap可以显示出来,为什么?请各位可以给我解答吗?感激不尽
[解决办法]
你这个是创建8位索引色的DIB,不知道你原来怎么会成功,完全是错误代码。
对于DIBSection来说用不到BITMAPFILEHEADER结构,这是存储文件的时候表示位图文件信息的。
索引色位图的BITMAPINFOHEADER结构后面要跟住调色板,所以分配空间的时候要多加一些,关键是连到一起而不能分开:
int size = sizeof(BITMAPINFO) + 255 * sizeof(RGBQUAD);
BITMAPINFO* bmpinfo = (BITMAPINFO*)(new BYTE[size]);// 因为BITMAPINFO结构中已经包含了一个RGBQUAD成员,所以分配时对于256色只需再跟255个RGBQUAD的空间
ZeroMemory(bmpinfo, size);
bmpinfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmpinfo->bmiHeader.biWidth = 320;
bmpinfo->bmiHeader.biHeight = 240;
bmpinfo->bmiHeader.biPlanes = 1;
bmpinfo->bmiHeader.biBitCount = 8;
bmpinfo->bmiHeader.biCompression = BI_RGB;
//bmpinfo->bmiHeader.biClrUsed = 0; // 前面都已经初始化为0,不用重复
//bmpinfo->bmiHeader.biClrImportant = 0;
//bmpinfo->bmiHeader.biSizeImage = 320*240;// 对于biCompression设为BI_RGB的此参数可为0
hBitmap = CreateDIBSection(hDC, bmpinfo, DIB_RGB_COLORS, &pBits, NULL, 0);