if ((*it)->GetRuntimeClass() == RUNTIME_CLASS(CPointGraph)) ar << (int)1 << *it;什么意思
时间: 2024-02-16 15:44:44 浏览: 14
这段代码是一个序列化操作,将CPointGraph类的实例指针保存到一个CArchive对象ar中。其中,GetRuntimeClass()函数返回该实例所属的类的运行时信息,RUNTIME_CLASS()函数则用于获取对应类的RUNTIME_CLASS对象。如果该实例是CPointGraph类的实例,则将值为1和指针保存到CArchive对象中。
相关问题
MFC序列化类对象时,如何判断类的类型
在MFC序列化类对象时,可以使用对象的Runtime Class(运行时类)来判断类的类型。Runtime Class是一个MFC中的类,用于描述一个类的类型信息,包括类的名称、父类、成员变量、成员函数等信息。每个MFC类都有一个对应的Runtime Class对象,可以通过调用类的GetRuntimeClass函数来获取该对象。
在序列化过程中,可以使用对象的Runtime Class来判断对象的类型,例如:
```
void CMyDoc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
// 写入数据
if (m_pShape->GetRuntimeClass() == RUNTIME_CLASS(CMyLine))
{
// 如果是CMyLine对象,则写入线段相关数据
ar << (BYTE)1; // 标识为线段类型
ar << (CMyLine*)m_pShape;
}
else if (m_pShape->GetRuntimeClass() == RUNTIME_CLASS(CMyRectangle))
{
// 如果是CMyRectangle对象,则写入矩形相关数据
ar << (BYTE)2; // 标识为矩形类型
ar << (CMyRectangle*)m_pShape;
}
// ...
}
else
{
// 读取数据
BYTE type;
ar >> type; // 读取类型标识
if (type == 1)
{
// 如果是线段类型,则读取线段数据并创建CMyLine对象
m_pShape = new CMyLine;
ar >> (CMyLine*)m_pShape;
}
else if (type == 2)
{
// 如果是矩形类型,则读取矩形数据并创建CMyRectangle对象
m_pShape = new CMyRectangle;
ar >> (CMyRectangle*)m_pShape;
}
// ...
}
}
```
在上述代码中,通过判断对象的Runtime Class来确定对象的类型,然后分别进行序列化操作。注意,在读取数据时,需要先读取类型标识,然后根据标识来创建相应类型的对象。
mfc单文档保存当前所有对话框的操作,使退出程序后重启恢复
要实现在 MFC 单文档应用程序中保存当前所有对话框的操作,并在退出程序后重新启动时恢复,您可以按照以下步骤进行操作:
1. 在文档类中添加成员变量来存储对话框的状态。例如,您可以使用一个 `std::vector` 来存储对话框指针。
```cpp
class CMyDoc : public CDocument
{
public:
std::vector<CDialog*> m_dialogs; // 存储对话框的指针
// ...
};
```
2. 在文档类的 `Serialize` 函数中保存和加载对话框的状态。将对话框指针存储到存档中。
```cpp
void CMyDoc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
// 保存对话框的状态
int numDialogs = m_dialogs.size();
ar << numDialogs;
for (int i = 0; i < numDialogs; i++)
{
if (m_dialogs[i] != nullptr)
{
ar << m_dialogs[i]->GetRuntimeClass()->m_lpszClassName; // 保存对话框类名
m_dialogs[i]->Serialize(ar); // 保存对话框状态
}
}
}
else
{
// 加载对话框的状态
int numDialogs;
ar >> numDialogs;
for (int i = 0; i < numDialogs; i++)
{
CString dialogClassName;
ar >> dialogClassName; // 加载对话框类名
// 根据对话框类名创建对话框实例
CRuntimeClass* pRuntimeClass = CRuntimeClass::FromName(dialogClassName);
if (pRuntimeClass != nullptr)
{
CDialog* pDialog = (CDialog*)pRuntimeClass->CreateObject();
if (pDialog != nullptr)
{
m_dialogs.push_back(pDialog);
pDialog->Serialize(ar); // 加载对话框状态
}
}
}
}
}
```
3. 在主框架类的 `InitInstance` 函数中恢复对话框的状态。在创建文档后,将保存的对话框状态恢复。
```cpp
BOOL CMyApp::InitInstance()
{
// ...
// 创建文档
AddDocTemplate(new CSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CMyDoc),
RUNTIME_CLASS(CMainFrame),
RUNTIME_CLASS(CMyView)));
// ...
if (pDoc != nullptr)
{
// 恢复对话框的状态
int numDialogs = pDoc->m_dialogs.size();
for (int i = 0; i < numDialogs; i++)
{
if (pDoc->m_dialogs[i] != nullptr)
{
pDoc->m_dialogs[i]->Create(pDoc); // 创建对话框
pDoc->m_dialogs[i]->ShowWindow(SW_SHOW); // 显示对话框
}
}
}
// ...
}
```
通过以上步骤,您可以在 MFC 单文档应用程序中保存当前所有对话框的状态,并在退出程序后重新启动时恢复。请注意,对话框类必须正确实现 `Serialize` 函数以保存和加载其状态。
希望这对您有所帮助!
相关推荐
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![cpp](https://img-home.csdnimg.cn/images/20210720083646.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)