代码不是很复杂呀,首先你要明白DIB的struct,;
这段代码从resource中读一个DDB到Memory中,为了最终以这个DDB到DIB,它需要做DIB struct的change,所以就有了中间的步骤,那些步骤几乎是MSDN中的标准,最后得到DIB

解决方案 »

  1.   

    程序从资源里面加载一个Bitmap,并且将系统当前的调色盘用Bitmap的
    调色盘替换。至于代码为何那样写,你必须先熟悉Bitmap的格式。
      

  2.   

    to  jishiping(JSP 季世平) 
    能讲讲Bitmap的格式?
      

  3.   

    Bmp文件的头结构,14个字节。Bmp文件才有,资源里的Bitmap没有。
    typedef struct tagBITMAPFILEHEADER { // bmfh  
            WORD    bfType;       //必须是 'BM'
            DWORD   bfSize;       //Bmp文件的大小
            WORD    bfReserved1;  //保留,必须是0
            WORD    bfReserved2;  //保留,必须是0
            DWORD   bfOffBits;    //图像数据的偏移量
    } BITMAPFILEHEADER; 
    Bitmap的头信息,40个字节。在Bmp文件和资源里都包含。
    typedef struct tagBITMAPINFOHEADER{ // bmih  
       DWORD  biSize;     //这个结构的大小,必须为40
       LONG   biWidth;    //图像的宽度
       LONG   biHeight;   //图像的高度
       WORD   biPlanes;   //平面个数,必须为1
       WORD   biBitCount;//每个像素需要的位数,可以是1,4,8,16,24,32 
       DWORD  biCompression; //压缩方法,0表示不压缩。通常我们见到的Bitmap都是不压缩的
       DWORD  biSizeImage;   //图像数据部分的大小。如果没有压缩,可以为0
       LONG   biXPelsPerMeter; //水平方向的分辨率。每米有多少像素点
       LONG   biYPelsPerMeter; //垂直方向的分辨率。每米有多少像素点
       DWORD  biClrUsed;       //图像的调色盘个数。只有biBitCount<=8才有效。当它为0时,调色盘个数个数是 1<<biBitCount
       DWORD  biClrImportant;  //重要的颜色个数,为0时,所有颜色都重要
    } BITMAPINFOHEADER;
    接着是调色盘信息,当biBitCount<=8时才有。下面是每个调色盘的结构。调色盘的个数由BITMAPINFOHEADER里的biBitCount和biClrUsed决定。
    typedef struct tagRGBQUAD { // rgbq  
        BYTE    rgbBlue;      //调色盘的蓝色分量
        BYTE    rgbGreen;     //调色盘的绿色分量
        BYTE    rgbRed;       //调色盘的红色分量
        BYTE    rgbReserved;  //保留,必须为0
    } RGBQUAD; 
    接下来是图像的数据部分,经过压缩的就不说了。对于biBitCount为16和32来说,很少见到,我也不是很熟。一般来说biBitCount的值为1,4,8,24,所能表示的颜色个数分别为2,16,256,全彩。当biBitCount<=8时,数据部分是每个像素点的调色盘号;当biBitCount==24时,每个像素点用3个字节表示,分别为蓝色,绿色,红色。
      

  4.   

    to :
      jishiping(JSP 季世平) 
      大侠,请教下面一句的意思和作用:
      LPBYTE pBitmapPictureData=(LPBYTE)lpBitmap+lpBitmap->biSize+
      (nNumberOfColors*sizeof(RGBQUAD));
      

  5.   

    (LPBYTE)lpBitmap 指向 BITMAPINFOHEADER 部分,就是开始。
    lpBitmap->biSize 是结构 BITMAPINFOHEADER 的大小。
    nNumberOfColors * sizeof(RGBQUAD) 是调色盘的大小。其中
    nNumberOfColors是调色盘的个数,sizeof(RGBQUAD)使每个调色盘的大小。所以(LPBYTE)lpBitmap + lpBitmap->biSize 指向调色盘部分,而(LPBYTE)
    lpBitmap+lpBitmap->biSize+(nNumberOfColors*sizeof(RGBQUAD))就指向图
    像的数据部分了。