MFC CDocument子类中的Serialize(CArchive& ar)方法,在打开文档时调用一次之后,再点击“打开”菜不被调用,解决。

void CLXYPolygonTriangulationDoc::Serialize(CArchive& ar)
{
	if (ar.IsStoring())
	{
		// do something
	}
	else
	{
		// do something else.
	}

}

打开程序后,第一次通过菜单“打开...”打开一个文档,上面的方法会被调用,之后,再想点击菜单“打开...”来打开一个文档触发上面的Serialize调用时,发现Serialize并没有调用。。

因为它会先查找一下之前是否已经有打开的该文件,如果找到就返回了。”-引自CSDN论坛上某大侠的的一句话。

解决方法:响应ID_FILE_OPEN命令(即菜单的“打开...”命令),响应函数为:

void CLXYPolygonTriangulationDoc::OnFileOpen()
{
	CString newName;
    if(!theApp.DoPromptFileName(newName,AFX_IDS_OPENFILE,
                        OFN_HIDEREADONLY|OFN_FILEMUSTEXIST,
                        TRUE,NULL))
        return;
	POSITION pos=theApp.GetFirstDocTemplatePosition();
    CSingleDocTemplate *pDocTemplate=(CSingleDocTemplate *)theApp.GetNextDocTemplate(pos);
    pDocTemplate->OpenDocumentFile(newName);
}

这样每次点击菜单“打开...”时,都会触发Serial()调用。

参考:http://bbs.csdn.net/topics/390781211

This is by design. In a typical MFC application, the Open File command is mapped
to the CWinApp::OnFileOpen() function. In earlier versions of MFC, this function
in turn called the CWinApp::OpenDocumentFile() function. Since MFC 4.0, there is
now an intervening CDocManager class, but the call to OnFileOpen() still

好的,我可以给出一个简单的示例代码,实现将当前文档的 `int m_nData[10]` 数据保存到文件的功能。请参考以下代码: ```cpp class CMyDoc : public CDocument { public: int m_nData[10]; // 要保存的数据 // 序列化函数 virtual void Serialize(CArchive& ar) { // 调用父类的序列化函数 CDocument::Serialize(ar); if (ar.IsStoring()) // 如果是保存操作 { // 将数据保存到文件 for (int i = 0; i < 10; i++) { ar << m_nData[i]; } } else // 如果是加载操作 { // 从文件加载数据 for (int i = 0; i < 10; i++) { ar >> m_nData[i]; } } } }; ``` 在上述代码,我们定义了一个 `int m_nData[10]` 数组,表示要保存的数据。在 `Serialize` 函数,我们首先调用父类的 `Serialize` 函数,以便处理文件头和文件尾等信息。然后,根据 `ar.IsStoring()` 函数的返回值,判断当前是进行保存操作还是加载操作。如果是保存操作,则将数据逐一写入到 `CArchive` 对象,这样就可以保存到文件;如果是加载操作,则从 `CArchive` 对象逐一读取数据,这样就可以将数据加载到内存。 使用上述代码,可以通过 `CFile` 类创建或打开文件,然后将文件对象传递给 `CArchive` 类,再调用 `Serialize` 函数即可完成文件的读写操作。例如: ```cpp CFile file(_T("data.dat"), CFile::modeCreate | CFile::modeReadWrite); CArchive ar(&file, CArchive::store); CMyDoc doc; doc.m_nData[0] = 1; doc.m_nData[1] = 2; // ... 设置其他数据 doc.Serialize(ar); ar.Close(); file.Close(); ``` 以上代码将 `doc` 对象的数据保存到名为 `data.dat` 的文件。如果要从文件加载数据,则可以将 `CArchive::store` 改为 `CArchive::load`,并调用 `Serialize` 函数即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值