VC编程:利用串行化打开DIB位图

来源:百度知道 编辑:UC知道 时间:2024/06/06 01:20:17
有一个现成的DIB类,提供了读,写,绘制DIB 的函数,我要利用这个来编一个可以打开并另存为的程序。问
1.菜单项的“打开位图"建立一个消息函数,用来建立文件打开对话框。这个函数应该在View类?框架类还是文档类啊?
2.关于串行化弄不太明白,程序都应该重载哪些函数?
请高手指教
现成的DIB已经提供了串行化功能。
void CDib::Serialize(CArchive& ar)
{
DWORD dwPos;
dwPos = ar.GetFile()->GetPosition();
TRACE("CDib::Serialize -- pos = %d\n", dwPos);
ar.Flush();
dwPos = ar.GetFile()->GetPosition();
TRACE("CDib::Serialize -- pos = %d\n", dwPos);
if(ar.IsStoring())
{
Write(ar.GetFile());
}
else
{
Read(ar.GetFile());
}
}

我说说思想吧。具体代码太麻烦了,抱歉。
1)如果要串行化,最好的情况是DIB这个类是从CObject类派生的子类,这样就可以重载Serialize这个专门用来串行化的函数。如果不是CObject的子类,由于DIB是现成的类,对生手来说,改造的话比较麻烦。可以这样,自己构造一个类,这个类是从CObject派生出来的子类,然后将DIB作为该类的一个成员类。

2)DIB最重要的就是DIB Section和DIB Bits这两个部分。重载1)中提到的类已经有的Serialize,由于CArchive已经支持对BYTE的串行化,因此可以简单把DIB Section和DIB Bits以BYTE的形式提供给CArchive。
形如:
if (ar.IsStoring()) {
//将内存中的DIB写到文件中
PBTYE pDIBSection = (PBYTE)&myDIB->m_DIBSection;//myDIB为DIB类,m_DIBSection为DIB Section
for (int i = 0; i < sizeof(BITMAPINFOHEADER); i++) {
ar << *pDIBSection++;
}
} else {
//从文件中读出DIB
...
}
...

大概是这样的代码就能把DIB Section进行串行化了。

3)你的程序中,不知道把DIB放在哪个类里了,假设为CDocument。重载CDocument的Serialize函数并加入需要串行化的代码行:
myDIB.Serialize();