你的代码我有一点不明白,你参数传进来一个文件名,那么你是想显示此文件并取它的一部分图素吗?如果是,就别对已经存在的文件用writefile啊……,如果你显示一定要用DIB的方式,那么也应该在CreateDIBSection以后往第四个参数的指针里面传图素数据,但是我也没发现。
我的理解是这样(如果不对高人指出,但你实验一下也就知道我说的对不对了……):
CreateDIBSection函数创建了一个DIB位图对象,分配了空间并得到了两样东西,一个是返回值,表示DIB对象句柄,一个是第四个参数给的数据区域的指针。创建好了以后数据区域还没有东西,只是空间被分配了,你要往第四个参数传出的地址中写像素值。这些像素值哪里来呢?从你使用CreateFile和ReadFile打开的,文件名由参数传入的,已有的bmp文件中来,bmp的像素数据的位置按照我前面说的得到。
所以你的流程应该是:
1.创建DIB(使用CreateDIBSection),得到的第四个参数的指针我们姑且称pDibBits。
2.打开一个位图(使用CreateFile和ReadFile),按我说的方法得到像素数据的指针,姑且称pFileBits。
3.memcpy(pDibBits,pFileBits,图像大小×3像素);
4.将DIB对象选入内存设备内容,并使用BitBlt函数显示。
5.然后对于你想取的像素值,操作pDibBits和操作pFileBits现在是一样的了,当然为了节约内存,在第3步过后,第2步读入内存的bmp文件应该已经可以释放掉了。你想对DIB的数据做这样那样的事就使用pDibBits就行了。
当然我个人比较喜欢用DDB而不是DIB来显示位图(当然因为我更不会用DX……),这里不废话……因为效果是一样的,只不过创建一个DDB必须要符合系统当前的像素位数。否则显示不能。你想试试DDB的话也去参考windows程序设计,注意这一点就行了。
另:
BYTE *lpbit=(BYTE *)bmpFileHeader+bmpFileHeader->bfOffBits;还是BYTE *lpbit=(BYTE *)lpbits+bmpFileHeader->bfOffBits;
这两个都一样。