跟我们在上面所介绍的“MFC应用程序向导”中的选项相一致,如果你选择的是“Support Restart Manager”,你可以在初始化函数中添加如下的代码:
m_dwRestartManagerSupportFlags =
AFX_RESTART_MANAGER_SUPPORT_RESTART;
AFX_RESTART_MANAGER_SUPPORT_RESTART;
如果你想选择“Reopen previously open documents”,可以添加如下的代码:
m_dwRestartManagerSupportFlags =
AFX_RESTART_MANAGER_SUPPORT_RESTART_ASPECTS;
AFX_RESTART_MANAGER_SUPPORT_RESTART_ASPECTS;
如果你想选择“Support application recover”,可以添加下面这行代码:
m_dwRestartManagerSupportFlags =
AFX_RESTART_MANAGER_SUPPORT_ALL_ASPECTS;
AFX_RESTART_MANAGER_SUPPORT_ALL_ASPECTS;
例如,我只想支持重启管理器,让软件可以在更新后重新启动,则可以这样进行应用程序的初始化:
CRestartManagerDemoApp::CRestartManagerDemoApp()
{
m_bHiColorIcons = TRUE;
// support Restart Manager
m_dwRestartManagerSupportFlags = AFX_RESTART_MANAGER_SUPPORT_RESTART;
// TODO: add construction code here,
// Place all significant initialization in InitInstance
}
{
m_bHiColorIcons = TRUE;
// support Restart Manager
m_dwRestartManagerSupportFlags = AFX_RESTART_MANAGER_SUPPORT_RESTART;
// TODO: add construction code here,
// Place all significant initialization in InitInstance
}
实例:创建支持重启管理器的MFC应用程序
下面我们以一个实际的例子,来看看如何在我们的MFC应用程序中添加对重启管理器的支持。
首先,启动Visual Studio 2010 CTP,创建一个单文档的应用程序RestartManagerDemo。按照我们前面的介绍,在“MFC应用程序向导”中选择“Support Restart Manager”和“Reopen previously open documents”选项,以支持应用程序的重新启动和文档的重新打开。
为了验证重启管理器重新打开文档的功能,我们在文档中添加一些数据,这些数据将在程序重新启动后自动被加载进来。
// 泡泡类,用于在视图中显示圆圈泡泡
class CBubble
{
public:
CBubble(CPoint cp, double fR)
{
m_nCenterPoint = cp;
m_fR = fR;
};
CBubble()
{};
// 圆心
CPoint m_nCenterPoint;
// 半径
double m_fR;
};
class CRestartManagerDemoDoc : public CDocument
{
protected: // create from serialization only
CRestartManagerDemoDoc();
DECLARE_DYNCREATE(CRestartManagerDemoDoc)
// Attributes
public:
// 保存数据的数组
CArray<CBubble,CBubble&> m_Array;
// Operations
public:
CArray<CBubble,CBubble&>& GetBubbleArray()
{
return m_Array;
};
//…
};
class CBubble
{
public:
CBubble(CPoint cp, double fR)
{
m_nCenterPoint = cp;
m_fR = fR;
};
CBubble()
{};
// 圆心
CPoint m_nCenterPoint;
// 半径
double m_fR;
};
class CRestartManagerDemoDoc : public CDocument
{
protected: // create from serialization only
CRestartManagerDemoDoc();
DECLARE_DYNCREATE(CRestartManagerDemoDoc)
// Attributes
public:
// 保存数据的数组
CArray<CBubble,CBubble&> m_Array;
// Operations
public:
CArray<CBubble,CBubble&>& GetBubbleArray()
{
return m_Array;
};
//…
};
然后,我们需要实现文档的序列化函数,使得我们的文档数据能够保存和重新加载:
// CRestartManagerDemoDoc serialization
void CRestartManagerDemoDoc::Serialize(CArchive& ar)
{
// 保存数据
if (ar.IsStoring())
{
// TODO: add storing code here
int nSize = m_Array.GetSize();
ar<<nSize;
for(int nIndex = 0; nIndex < nSize; ++nIndex )
{
CBubble tempBubble = m_Array.GetAt( nIndex );
ar<<tempBubble.m_nCenterPoint;
ar<<tempBubble.m_fR;
}
}
else // 加载数据
{
// TODO: add loading code here
int nSize = 0;
ar>>nSize;
for(int nIndex = 0; nIndex < nSize; ++nIndex )
{
//CBubble tempBubble = m_Array.GetAt( nIndex );
CPoint tempPoint;
double tempR;
ar>>tempPoint;
ar>>tempR;
m_Array.Add( CBubble( tempPoint, tempR) );
}
}
}
void CRestartManagerDemoDoc::Serialize(CArchive& ar)
{
// 保存数据
if (ar.IsStoring())
{
// TODO: add storing code here
int nSize = m_Array.GetSize();
ar<<nSize;
for(int nIndex = 0; nIndex < nSize; ++nIndex )
{
CBubble tempBubble = m_Array.GetAt( nIndex );
ar<<tempBubble.m_nCenterPoint;
ar<<tempBubble.m_fR;
}
}
else // 加载数据
{
// TODO: add loading code here
int nSize = 0;
ar>>nSize;
for(int nIndex = 0; nIndex < nSize; ++nIndex )
{
//CBubble tempBubble = m_Array.GetAt( nIndex );
CPoint tempPoint;
double tempR;
ar>>tempPoint;
ar>>tempR;
m_Array.Add( CBubble( tempPoint, tempR) );
}
}
}
完成文档类的工作后,我们就有了保存数据的容器,现在我们需要对数据进行修改和显示。在视图类中,我们通过鼠标点击,修改文档中的数据,向其中添加CBubble对象。