我在前面头文件*.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是不需要初始化的。
解决方案 »
- 如何将float或者int型数据存入文件中,并能按float或int型取出?
- 如何用vc6实现属性对话框
- CDataGrid控件如何得到选择行的项
- 高手们去哪了?
- 求有关DDE通信的资料和例程
- 今天发现笔记本的网卡的MAC地址00-00-00-00-00-00,我不明白那笔记本如何和其他的计算机通信?
- 哪位有Xtreme Toolkit类库中(最新版)的CTabView.cpp的文件
- ##散分,如何进一步学习VC
- 请问在win2000下,怎样卸载或杀掉被共享的dll?拜托了!
- QQ聊天室——怎么把别人搞掉线?
- 关于位图按钮,高分相赠
- 我在使用AppWizard生成程序的时候,没有选择winsock,现在我想把它补上,该如何做呢?
{
m_Bitmap.Serialize();//m_Bitmap为CBitmap的一个对象
if(ar.IsStoring())
{
...
}
else
{
..
}
<<和>>右端只能是一些简单类型,比如整形等等
//********************************************************************************
//* 名称: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;
}
<<和>>操作符只支持一些简单的数据类型的序列化(比如说int,double, CArray)--也就是在不同的数据类型中作了重载。所以,你定义的CBitmap当然不能简单的用<<,>>序列化了。
你可以派生自CObject一个类,重载这个类的Serilize()函数,读写,保存数据。在需要的地方调用这个函数即可。
一般比较常用的做法都是自己写读入,保存函数(从一个磁盘文件上)。这方面的资料很多,很容易查的到。