我看网上的位图文件读写操作代码中经常有这一行
BITMAP bm;    
.......       
::GetObject(hBitmap,sizeof(bm),(LPSTR)&bm);   //为什么要这样进行类型转化
它为什么要将bm类型指针转化为LPSTR类型
还有这个也是
 ::GetDIBits(hDC, hBitmap, 0, (UINT) bm.bmHeight,(LPSTR)lpbi + sizeof(BITMAPINFOHEADER)+dwPaletteSize,(BITMAPINFO*)lpbi,DIB_RGB_COLORS);// 获取该调色板下新的像素值

解决方案 »

  1.   

    typedef CHAR *LPSTR, *PSTR;
    个人觉得这里的::GetDIBits(hDC, hBitmap, 0, (UINT) bm.bmHeight,(LPSTR)lpbi + sizeof(BITMAPINFOHEADER)+dwPaletteSize,(BITMAPINFO*)lpbi,DIB_RGB_COLORS);写成BYTE*可能会好一些
      

  2.   

    比如这个地方
    GetDIBits(hDC, hBitmap, 0, (UINT) bm.bmHeight,(LPSTR)lpbi + sizeof(BITMAPINFOHEADER)+dwPaletteSize,(BITMAPINFO*)lpbi,DIB_RGB_COLORS);
    如果你不强制转换的话,这个很可以会崩溃想想(char*)lpbi + NUMBER和lpbi + NUMBER是不一样的(加入NUMBER为一个常数,lpbi为其它类型的指针)
    (char*)lpbi + NUMBER等于(char*)lpbi + NUMBER * sizeof(char)
    lpbi + NUMBER 等于 lpbi + NUMBER * sizeof(lpbi的类型)
      

  3.   

    那就是说我用其他的例如LPCSTR BYTE 等都可以咯
      

  4.   


    那这个的强制转化又是什么作用呢
    ::GetObject(hBitmap,sizeof(bm),(LPSTR)&bm);
      

  5.   

    函数参数是LPVOID类型的,应该不需要转成char*,这个可能是个人习惯,看代码的时候更清晰一点。
      

  6.   

    我有点明白了
    意思是这里强制转换可能和GetDIBits函数内部使用该指针的方式有关比如GetDIBits对应形参为p
    函数体里面执行了p++操作对于不同类型的指针p++的结果不一样p是int *的话 p++意味着指针移动4个字节p是char *的话 p++意味着移动1个字节像素值是0-255之间的一个数 通常1字节表示
      

  7.   

    ::GetObject(hBitmap,sizeof(bm),(LPSTR)&bm); //为什么要这样进行类型转化
    它为什么要将bm类型指针转化为LPSTR类型
    =============
    这个API的原型第三个参数要求的是LPVOID,也就是一个以字节为单位的缓冲区,因为LPSTR这个指针也是指向认字节为单位的,所以可以。
      

  8.   


    (char*)lpbi+sizeof(BITMAPINFOHEADER)  意思是移动到该指针值+sizeof(BITMAPINFOHEADER)个字节的指针位置处吗,那为什么要放到这后面,不是要填充BITMAPINFO吗
      

  9.   

    这个你要看看BMP文件的数据结构了
      

  10.   

    哦,不好意思了,GetDIBits这个函数的作用我没理解透。