字体序列化保存读写
在实际开发中,程序中经常需要用到保存窗口大小、窗口位置、字体设置功能,以便程序在下次运行后,自动恢复上次的用户的使用设置(比如窗口的大小、位置、字体等等),这样做会给用户带来良好的软件操作体验,提高用户的使用满意度。
软件配置的读取,可以采用多种方法实现:数据库、INI文件、注册表等都可以实现。不过,在VC开发中,使用MFC的序列化机制大概是所有方法中最方便、最好用的配置保存方法了。因为使用序列化(Serialize)后,你会有没写什么代码,程序打开关闭后,配置自动读取和保存的感觉。
好了,字体读写类的代码不到100行。完成了自动创建默认字体、读写字体、序列化读写到磁盘等功能。
//读取
CObFont *MyObFont;
CFile file;
if (file.Open("MyNotepad.dat", CFile::modeRead))
{
CArchive archive(&file, CArchive::load);
archive >>MyObFont;
archive.Close();
file.Close();
}
else
{
MyObFont = new CObFont(); //创建默认字体
}
LOGFONT lf;
lf=MyObFont->GetLogFont(); //得到字体
CFont *pfont;
CObFont *MyObFont;
pfont=XXXObj.GetFont();
MyObFont->SetLogFont(pfont);
CFile file;
if (file.Open("MyNotepad.dat", CFile::modeCreate | CFile::modeWrite))
{
CArchive archive(&file, CArchive::store);
archive << MyObFont; //字体数据写入文档
archive.Close();
file.Close();
}
在实际开发中,程序中经常需要用到保存窗口大小、窗口位置、字体设置功能,以便程序在下次运行后,自动恢复上次的用户的使用设置(比如窗口的大小、位置、字体等等),这样做会给用户带来良好的软件操作体验,提高用户的使用满意度。
软件配置的读取,可以采用多种方法实现:数据库、INI文件、注册表等都可以实现。不过,在VC开发中,使用MFC的序列化机制大概是所有方法中最方便、最好用的配置保存方法了。因为使用序列化(Serialize)后,你会有没写什么代码,程序打开关闭后,配置自动读取和保存的感觉。
要使用保存字体功能,首先从CObject继承写一个字体读写类(CObFont),源码如下:
//CObFont.h
#ifndef MyNotepad_ObFont_H_
#define MyNotepad_ObFont_H_
#include <afxwin.h>
class CObFont : public CObject
{
DECLARE_SERIAL( CObFont )
private:
LOGFONT lf;
public:
CObFont();
virtual void Serialize(CArchive &archive);
LOGFONT GetLogFont() const;
BOOL SetLogFont(CFont *pfont);
#ifdef _DEBUG
virtual void Dump( CDumpContext& dumpSite ) const;
virtual void AssertValid() const;
#endif
};
#endif //MyNotepad_ObFont_H_
//CObFont.cpp
#include "CObFont.h"
CObFont::CObFont()
{
CFont *font=NULL;
font = new CFont();
font->CreateFont(12,0,0,0,400,0,0,0,
DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY,
DEFAULT_PITCH|FF_DONTCARE,
"Fixedsys");
font->GetLogFont(&lf);
delete font;
}
void CObFont::Serialize(CArchive &archive)
{
CObject::Serialize(archive);
if (archive.IsStoring())
archive.Write(&lf, sizeof(lf));
else
archive.Read(&lf, sizeof(lf));
}
LOGFONT CObFont::GetLogFont() const
{
return lf;
}
BOOL CObFont::SetLogFont(CFont *pfont)
{
if (pfont !=NULL)
{
pfont->GetLogFont(&lf);
}
return TRUE;
}
#ifdef _DEBUG
void CObFont::Dump( CDumpContext& dumpSite ) const
{
CObject::Dump(dumpSite);
//dumpSite ;
}
void CObFont::AssertValid() const
{
// check base class first
CObject::AssertValid();
// check data members.
}
#endif //_DEBUG
IMPLEMENT_SERIAL(CObFont, CObject, 0)
好了,字体读写类的代码不到100行。完成了自动创建默认字体、读写字体、序列化读写到磁盘等功能。
//读取
CObFont *MyObFont;
CFile file;
if (file.Open("MyNotepad.dat", CFile::modeRead))
{
CArchive archive(&file, CArchive::load);
archive >>MyObFont;
archive.Close();
file.Close();
}
else
{
MyObFont = new CObFont(); //创建默认字体
}
LOGFONT lf;
lf=MyObFont->GetLogFont(); //得到字体
============================================
//保存到磁盘CFont *pfont;
CObFont *MyObFont;
pfont=XXXObj.GetFont();
MyObFont->SetLogFont(pfont);
CFile file;
if (file.Open("MyNotepad.dat", CFile::modeCreate | CFile::modeWrite))
{
CArchive archive(&file, CArchive::store);
archive << MyObFont; //字体数据写入文档
archive.Close();
file.Close();
}