HBITMAP CreateBitmap(
int nWidth,
int nHeight,
BYTE nPlanes,//表示用于表示象素的位面的面数,它到底应该设成几?有什么说法?
             //nPlanes设成3行不?
BYTE nBitCount,//这个参数表示什么?
LPSTR lpBits)
如果我假设存储的位面数一直是4,而且,如果一个象素是4位的(可以表示16种颜色),那应该是每个位面存储1位(0或1),那nBitCount是不是应该是1?(难道nBitCount表示的每个位平面上位数?),如果是这样,如果一个象素为8位的,位面数还设成4,那是不是说明每个位面上存储2位(2*4=8),也就是说nBitCount就是2了呢?

解决方案 »

  1.   

    我记得是设为1
    看看msdn吧
      

  2.   

    函数原型是这样的吧:
    HBITMAP CreateBitmap(
      int nWidth,         // bitmap width, in pixels
      int nHeight,        // bitmap height, in pixels
      UINT cPlanes,       // number of color planes
      UINT cBitsPerPel,   // number of bits to identify color
      CONST VOID *lpvBits // color data array
    );
    nPlanes在这里是cPlanes,翻译为“位面”,但至今未明白什么是“位面”。记得在MSDN里查同类函数的时候看到这个参数应该设置为1。
    nBitCount在这里是cBitsPerPel,用来说明多少个二进制位描述一个像素点。
      

  3.   

    MSDN在BITMAPINFOHEADER结构的说明中的原文:
    ……
    typedef struct tagBITMAPINFOHEADER{
      DWORD  biSize; 
      LONG   biWidth; 
      LONG   biHeight; 
      WORD   biPlanes; 
      WORD   biBitCount; 
      DWORD  biCompression; 
      DWORD  biSizeImage; 
      LONG   biXPelsPerMeter; 
      LONG   biYPelsPerMeter; 
      DWORD  biClrUsed; 
      DWORD  biClrImportant; 
    } BITMAPINFOHEADER, *PBITMAPINFOHEADER; 
    ……
    ……
    biPlanes 
      Specifies the number of planes for the target device. This value must be set to 1. 
    ……供参考
      

  4.   

    试问象我们样的水平能写出关于位图的程序吗?显然不能,因为认识的不透彻,充其量也是照别人的代码胡抄一气!
    我今天也一直在看位面这个概念,我在一本书上看到它表示的是显示缓冲区(显存)内存储位图的介质,如果位面的值不是n,那存储的介质是n个平行的位面,而每个位面上存储的应该是位图的实质内容(0、1颜色值),n个位面上的值组合在一起就形成了一个象素的真实颜色。
    这本书说如果一个象素为4位的,那存储在4个位面上(红、绿、蓝、亮度),每个位面表示一位即可。
    可我不明白的是如果我的象素颜色不是4位,如果是2位、32位(不知道是不是只能用4位表示)的时候,这个所谓的位面到底应该如何设置,我感觉CReateBitmap()参数上的那个nPlanes应该是指的我所说的这个位面。可谁真正明白呢??
      

  5.   

    改正:上面我写的把"如果位面的值不是n"改成"如果位面的值是n".
    如果对于DIB,colorplanes总是1,那什么时候不是1呀?
      

  6.   

    自问水平甚低,不过学VC到现在,大部分时间还是在写GDI程序,尽管都比较简单。
    对于DIB(Device Independent Bitmap),color planes始终是1,这点应该很好理解。
    对于DDB(Device Dependent Bitmap), color planes的值可以通过GetDeviceCaps函数获得。
    而cBitPerPel既然写明了是表示每个像素点用的二进制位数,则显然与color planes无关了。个人体会:
    color planes只是作为传递给GDI的一个参数,让GDI知道该如何去操纵显示设备,如何用RGB值去填充显示内存区域,至于具体如何操作,那就是API和硬件的工作了。
    参数传递旨在让API按照程序员的意思去执行,则我们给它合适的参数就可以了。
      

  7.   

    谢谢jeffry,尽管这个问题没有解决,不过搞不明白问题就是郁闷。郁闷到有人能解决这个问题。
      

  8.   

    要是planes写2或3.,,gdi应该如何去操作显示设备呀?呵呵,这不得知道其存储原理吗?肯定得弄明白!
      

  9.   

    下面一段话应如何理解呢?
    标准VGA显示卡使用的是18位的颜色寄存器,因此它可以表示262144种颜色。然而,由于视频内存的限制,标准的VGA卡只能采用4位的颜色代码,。(摘自vc技术内幕)
    我想知道什么是颜色寄存器,它与颜色码不是一个东西吗???那既然显存不支持那么多位(18位),那为什么还弄出个18位的寄存器?这不是徒劳吗?
      

  10.   

    请问物理调色板是位于哪里呀?显示器内?显卡内?我只知道系统调色板肯定是在windows内。