我的代码如下:
                  CBitmap myBitmap; 
CDC myDC; 
myDC.CreateCompatibleDC(NULL);  myBitmap.CreateCompatibleBitmap(&myDC,800,600);
CBitmap *pOldBitmap = myDC.SelectObject(&myBitmap);                 int cv=0;
for(np=0;np<=Mx;np++)
   {
    for(nq=0;nq<=My;nq++)
{
                                 cv=(np*nq)%255;
                                 myDC.SetPixel(np,nq,RGB(cv,cv,cv));
                                 //我验证过,如果cv值在0~255之间的话就是黑色的,其他值的地方就是白色的了.为什么会这样呢?请大家帮帮我!
                                }
    }

myDC.SelectObject(pOldBitmap); 
SaveBmp((HBITMAP)myBitmap,"D:\\111.bmp"); myDC.DeleteDC();
myBitmap.DeleteObject(); 

解决方案 »

  1.   

    问题出在 myDC.CreateCompatibleDC(NULL);   
    换成 myDC.CreateCompatibleDC(GetDC(HWND_DESKTOP));    试试。
      

  2.   

    出现了这个错误!
    error C2660: 'GetDC' : function does not take 1 parameters
      

  3.   

    //SaveBmp((HBITMAP)myBitmap,"D:\\111.bmp"); SaveBmp() 的实现检查一下会不会有问题。
      

  4.   

    myDC.CreateCompatibleDC(CDC::FromHandle(::GetDC(HWND_DESKTOP)));
      

  5.   

    myDC.CreateCompatibleDC(CDC::FromHandle(::GetDC(HWND_DESKTOP)));这样还是不行,跟以前的结果是一样的
    请问一下有没有SaveBmp() 函数,可行的代码参考一下。谢谢了~~~~~~
      

  6.   

    BOOL   CCovImage::SaveBitmapToFile(HBITMAP   hBitmap,   LPCTSTR   lpFileName   ,   HDC   hWndDC   )  
      {  
              HDC                           hDC;                                 //设备描述表  
              int                           iBits;                                 //当前显示分辨率下每个像素所占字节数  
              WORD                         wBitCount;                         //位图中每个像素所占字节数  
              DWORD                       dwPaletteSize=0,         //定义调色板大小,   位图中像素字节大小   ,位图文件大小   ,   写入文件字节数  
                                              dwBmBitsSize,  
                                              dwDIBSize,   dwWritten;  
              BITMAP                     Bitmap;                                 //位图属性结构  
              BITMAPFILEHEADER       bmfHdr;                         //位图文件头结构  
              BITMAPINFOHEADER       bi;                               //位图信息头结构    
              LPBITMAPINFOHEADER   lpbi;                         //指向位图信息头结构  
       
              HANDLE                     fh,   hDib,   hPal,hOldPal=NULL;         //定义文件,分配内存句柄,调色板句柄  
           
              //计算位图文件每个像素所占字节数  
              //hDC   =   CreateDC("DISPLAY",NULL,NULL,NULL);  
      hDC   =   ::CreateCompatibleDC(   hWndDC   )   ;  
              iBits   =   GetDeviceCaps(hDC,   BITSPIXEL)   *   GetDeviceCaps(hDC,   PLANES);  
              DeleteDC(hDC);  
       
              if   (iBits   <=   1)  
                      wBitCount   =   1;  
              else   if   (iBits   <=   4)  
                      wBitCount   =   4;  
              else   if   (iBits   <=   8)  
                      wBitCount   =   8;  
              else   if   (iBits   <=   24)  
                      wBitCount   =   24;  
      else  
      wBitCount   =   24   ;  
               
              //计算调色板大小  
              if   (wBitCount   <=   8)  
                  dwPaletteSize   =   (1   <<     wBitCount)   *   sizeof(RGBQUAD);  
           
              //设置位图信息头结构  
              GetObject(hBitmap,   sizeof(BITMAP),   (LPSTR)&Bitmap);  
              bi.biSize                         =   sizeof(BITMAPINFOHEADER);  
              bi.biWidth                     =   Bitmap.bmWidth;  
              bi.biHeight                     =   Bitmap.bmHeight;  
              bi.biPlanes                     =   1;  
              bi.biBitCount                 =   wBitCount;  
              bi.biCompression             =   BI_RGB;  
              bi.biSizeImage                 =   0;  
              bi.biXPelsPerMeter         =   0;  
              bi.biYPelsPerMeter         =   0;  
              bi.biClrUsed                 =   0;  
              bi.biClrImportant             =   0;  
       
              dwBmBitsSize   =   ((Bitmap.bmWidth   *   wBitCount+31)/32)   *   4   *   Bitmap.bmHeight   ;  
               
              //为位图内容分配内存  
              hDib     =   GlobalAlloc(GHND,dwBmBitsSize+dwPaletteSize+sizeof(BITMAPINFOHEADER));  
              lpbi   =   (LPBITMAPINFOHEADER)GlobalLock(hDib);  
              *lpbi   =   bi;  
           
              //   处理调色板      
              hPal   =   GetStockObject(DEFAULT_PALETTE);  
              if   (hPal)  
              {  
                      hDC     =   ::GetDC(NULL);  
                      hOldPal   =   ::SelectPalette(hDC,   (HPALETTE)hPal,   FALSE);  
                      RealizePalette(hDC);  
              }  
           
              //   获取该调色板下新的像素值  
              GetDIBits(hDC,   hBitmap,   0,   (UINT)   Bitmap.bmHeight,  
                (LPSTR)lpbi   +   sizeof(BITMAPINFOHEADER)  
                  +dwPaletteSize,  
                (LPBITMAPINFO   )  
                  lpbi,   DIB_RGB_COLORS);  
           
              //恢复调色板      
              if   (hOldPal)  
              {  
                      SelectPalette(hDC,   (HPALETTE)hOldPal,   TRUE);  
                      RealizePalette(hDC);  
                      ::ReleaseDC(NULL,   hDC);  
              }  
           
              //创建位图文件          
              fh   =   CreateFile(lpFileName,   GENERIC_WRITE,    
                      0,   NULL,   CREATE_ALWAYS,  
                      FILE_ATTRIBUTE_NORMAL   |   FILE_FLAG_SEQUENTIAL_SCAN,   NULL);  
           
              if   (fh   ==   INVALID_HANDLE_VALUE)  
                  return   FALSE;  
           
              //   设置位图文件头  
              bmfHdr.bfType   =   0x4D42;     //   "BM"  
              dwDIBSize         =   sizeof(BITMAPFILEHEADER)    
                          +   sizeof(BITMAPINFOHEADER)  
                              +   dwPaletteSize   +   dwBmBitsSize;      
              bmfHdr.bfSize   =   dwDIBSize;  
              bmfHdr.bfReserved1   =   0;  
              bmfHdr.bfReserved2   =   0;  
              bmfHdr.bfOffBits   =   (DWORD)sizeof(BITMAPFILEHEADER)    
                      +   (DWORD)sizeof(BITMAPINFOHEADER)  
                      +   dwPaletteSize;  
           
              //   写入位图文件头  
              WriteFile(fh,   (LPSTR)&bmfHdr,   sizeof(BITMAPFILEHEADER),   &dwWritten,   NULL);  
           
              //   写入位图文件其余内容  
              WriteFile(fh,   (LPSTR)lpbi,   dwDIBSize,    
              &dwWritten,   NULL);  
           
              //清除      
              GlobalUnlock(hDib);  
              GlobalFree(hDib);  
              CloseHandle(fh);  
               
              return   TRUE;  
       
      }   
      

  7.   

    myBitmap.CreateCompatibleBitmap(&myDC,800,600); 
    ==> myBitmap.CreateCompatibleBitmap(CDC::FromHandle(::GetDC(NULL)),800,600); 就好了。这个问题很绕。记住以下几点就好了:
    1. CreateCompatibleBitmap是创建和给出设备场景中的当前位图具有同样格式的位图;
                                             ^^^^^^^^^^^^^^^^^
    2. CreateCompatibleDC() 是创建一个内存DC
                                     ^^^^^
    3. 内存DC会被默认选中一个1x1的单色位图
                  ^^^^^^^^^^^^^^^^^^^^^^
    4. GetDC取得的是设备DC,因此它的位图才是有颜色的