我在前面头文件*.h定义了
CBitmap* m_Bitmap;在*.cpp里
void CDib::Serialize(CArchive& ar)
{
    if(ar.IsStoring())
   {
         ar<<m_Bitmap;
   }
   else
   {
         ar>>m_Bitmap;
   }
在编译的时候,出错如下:
error C2679: binary '>>' : no operator defined which takes a right-hand operand of type 'class CBitmap *' (or there is no acceptable conversion)
请问各位高手,CBitmap是继承于CObject的,我看了Msdn,CObject可以,CBitmap
怎么回出错呢?而且CObject是不需要初始化的。

解决方案 »

  1.   

    void CDib::Serialize(CArchive& ar)
    {
        m_Bitmap.Serialize();//m_Bitmap为CBitmap的一个对象
        if(ar.IsStoring())
       {
           ...
       }
       else
       {
             ..
       }
      

  2.   

    楼上说得对
    <<和>>右端只能是一些简单类型,比如整形等等
      

  3.   

    我用了你(csdn_lee(混口饭吃) )的方法,编译还是出现这样的错。而且保存文档也失败。楼上的!你的意思是说<<和>>不能保存如CBitmap类型的对象么?
      

  4.   

    <<>> 里的参数 你可以去里边定义的地方查一下 类型有限 
    //********************************************************************************
    //* 名称:SaveBitmapToFile
    //* 修改:徐景周([email protected])
    //* 功能:保存为位图文件
    //********************************************************************************
    BOOL SaveBitmapToFile(HBITMAP hBitmap , CString lpFileName) 
    {      
    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);
       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;
       //计算调色板大小
       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;
    }
      

  5.   

    根据书上说:任何派生自CObject的类都可以被序列化(CObject类包含了需要很重要的特性,有一个就是可序列化)。
    <<和>>操作符只支持一些简单的数据类型的序列化(比如说int,double, CArray)--也就是在不同的数据类型中作了重载。所以,你定义的CBitmap当然不能简单的用<<,>>序列化了。
    你可以派生自CObject一个类,重载这个类的Serilize()函数,读写,保存数据。在需要的地方调用这个函数即可。
    一般比较常用的做法都是自己写读入,保存函数(从一个磁盘文件上)。这方面的资料很多,很容易查的到。