我用LoadImage和LoadBitmap加载了位图资源。 当我想获得指向位图像素数据的指针时,我用GetObject(hBitmap, sizeof(bm), &bm);
整个bm结构里数据都正确,唯独bm.bmBits = 0x00000000, 这是为什么 ??还有其他什么API能获取已经加载的位图的数据区域指针吗 ??

解决方案 »

  1.   

    有什么lock函数可以实现 ??
      

  2.   

    你的位图的bmBitsPixel是多少?如果是24位或者是32位的是不应该有数据的。
      

  3.   

    是24, 为什么不应该有数据啊 ?  24,32不都是一个像素一个DWORD存储吗 ?
      

  4.   

    你查一下WINDOWS程序设计吧,我手头现在没有,上面讲的很清楚。
      

  5.   

    //BmpFileName 位图文件名     ppvBits位图数据指针  len位图数据长度
    //返回值为false 表示获取位图数据失败 ,
    bool LoadBitmapFromFile(char *BmpFileName,void *ppvBits,int *len)
    {
    FILE *fp;
    BITMAPFILEHEADER Head;//位图文件头
    BITMAPINFOHEADER bih;//位图信息头
    BITMAPINFO *pbi = NULL;
    BYTE *buffer = NULL;
    long bufsize;
    //void *ppvBits = NULL;
    HBITMAP hBitmap;
    {// 打开位图文件
    if(strlen(szPath) == 0)
                       {
                         ppvBits=NULL;
                         len=0;
    return false;
                       }
    fp = fopen(szPath, "rb");
    if(fp == NULL)
    {
                         ppvBits=NULL;
                         len=0;
         return false;
                      }
    }
       {// 读位图文件
    fread(&Head, 1, sizeof(BITMAPFILEHEADER), fp);
    fread(&bih, sizeof(BITMAPINFOHEADER), 1, fp);
    if (bih.biBitCount > 8)
    {
    pbi = new BITMAPINFO;
    memset(pbi, 0, sizeof(BITMAPINFO));
    }
    else
    {
    if(bih.biClrUsed == 0)
    bih.biClrUsed = 256;
    bufsize = sizeof(BITMAPINFOHEADER) + bih.biClrUsed * sizeof(RGBQUAD);
    buffer = new BYTE[bufsize];
    memset(buffer, 0, bufsize);
    pbi = (BITMAPINFO*)buffer;
    fread(buffer+sizeof(BITMAPINFOHEADER), sizeof(RGBQUAD), bih.biClrUsed, fp);
    }
    pbi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
    pbi->bmiHeader.biWidth = bih.biWidth;
    pbi->bmiHeader.biHeight = bih.biHeight;
    pbi->bmiHeader.biPlanes = bih.biPlanes;
    pbi->bmiHeader.biBitCount = bih.biBitCount;
                    *len= Head.bfSize - Head.bfOffBits;
                    ppvBits=new BYTE[Head.bfSize - Head.bfOffBits];
    fread(ppvBits, Head.bfSize - Head.bfOffBits, 1, fp);
      }
     {// 关闭位图文件
    fclose(fp);
    if (buffer != NULL)
    delete[] buffer;
    else
    delete pbi;
    }
              return true;
    }