关于GetDIBits,这个是为什么
如下代码,传入handle(实际上是资源的名称),获取位图数据,DC是桌面的DC。
思路是调用两次GetDIBits,第一次仅仅获取BITMAPINFO结构,第二次获取数据。
运行到_buf = new unsigned char [_res]的时候,_res = 256,我的位图是8 * 8,显示器是32bit真彩,这个数字好像是对的,但是接下来调用GetDIBits以后,_buf原来指向的那块内存区域内很准确地存放了位图的数据(我和texpad打开的比对过了,就多了alpha位),但是_buf自己却变成了0x000000ff,我晕倒了……
是我调用的方法不对吗?还是buf开的长度不对?求大虾解决:S
unsigned char* LoadBmpData(WORD handle)
{
//load the plan data
unsigned long _res = 0;
unsigned char* _buf = 0;
HBITMAP _hBmp = LoadBitmap(hInstance, MAKEINTRESOURCE(handle));
if(!_hBmp)
return 0;
//load bmp info
BITMAPINFO _bmpInfo;
ZeroMemory(&_bmpInfo, sizeof(BITMAPINFO));
_bmpInfo.bmiHeader.biSize = sizeof(BITMAPINFO);
_res = GetDIBits(hDC, _hBmp, 0, 0, NULL, &_bmpInfo, DIB_RGB_COLORS);
if(!_res)
return 0;
//get data
_res = _bmpInfo.bmiHeader.biHeight * _bmpInfo.bmiHeader.biWidth * _bmpInfo.bmiHeader.biBitCount / 8;
_buf = new unsigned char[_res];
_res = GetDIBits(hDC, _hBmp, (UINT)0, (UINT)_bmpInfo.bmiHeader.biHeight, (LPVOID)_buf, &_bmpInfo, DIB_RGB_COLORS);
if(!_res)
{
delete [] (_buf);
_buf = 0;
}//if
DeleteObject(_hBmp);
return _buf;
}