|
发表于 2025-7-5 16:01:01
|
显示全部楼层
下面我将为你介绍如何在 MFC 应用程序里达成项目数据的保存与加载功能。我会分步骤说明实现方法,并且给出关键代码片段。
1. 数据结构设计
首先要设计一个类,用来保存项目的所有数据。
- class CMyProjectData
- {
- public:
- CString m_strText1; // 文本框1的数据
- CString m_strText2; // 文本框2的数据
- double m_dResult1; // 计算结果1
- double m_dResult2; // 计算结果2
- // 可以根据实际需求添加更多的数据成员
- public:
- // 序列化函数 - 把数据保存到归档文件
- void Serialize(CArchive& ar);
- };
- void CMyProjectData::Serialize(CArchive& ar)
- {
- if (ar.IsStoring())
- {
- // 保存数据
- ar << m_strText1;
- ar << m_strText2;
- ar << m_dResult1;
- ar << m_dResult2;
- }
- else
- {
- // 加载数据
- ar >> m_strText1;
- ar >> m_strText2;
- ar >> m_dResult1;
- ar >> m_dResult2;
- }
- }
复制代码
2. 在文档类中添加项目数据成员
要在应用程序的文档类(继承自CDocument)里添加CMyProjectData对象。
- class CMyProjectDoc : public CDocument
- {
- protected:
- CMyProjectData m_projectData;
- public:
- // 访问项目数据的接口
- CMyProjectData& GetProjectData() { return m_projectData; }
- const CMyProjectData& GetProjectData() const { return m_projectData; }
- // 重写序列化函数
- virtual void Serialize(CArchive& ar);
- };
- void CMyProjectDoc::Serialize(CArchive& ar)
- {
- // 调用项目数据的序列化函数
- m_projectData.Serialize(ar);
- }
复制代码
3. 实现保存和加载功能
保存项目
在视图类或者对话框类中,可以借助文档对象来保存项目。
- void CMyProjectView::OnFileSave()
- {
- // 获取文档对象
- CMyProjectDoc* pDoc = GetDocument();
- ASSERT_VALID(pDoc);
- // 更新文档中的数据
- CString strText1, strText2;
- GetDlgItemText(IDC_EDIT1, strText1);
- GetDlgItemText(IDC_EDIT2, strText2);
-
- pDoc->GetProjectData().m_strText1 = strText1;
- pDoc->GetProjectData().m_strText2 = strText2;
-
- // 触发文档的保存操作
- pDoc->OnSaveDocument(NULL);
- }
复制代码
加载项目
在视图类或者对话框类中,可以通过文档对象加载项目。
- void CMyProjectView::OnInitialUpdate()
- {
- CView::OnInitialUpdate();
-
- // 加载文档数据
- LoadDocumentData();
- }
- void CMyProjectView::LoadDocumentData()
- {
- // 获取文档对象
- CMyProjectDoc* pDoc = GetDocument();
- ASSERT_VALID(pDoc);
- // 从文档中获取数据
- const CMyProjectData& data = pDoc->GetProjectData();
- // 更新界面
- SetDlgItemText(IDC_EDIT1, data.m_strText1);
- SetDlgItemText(IDC_EDIT2, data.m_strText2);
-
- // 显示计算结果
- CString strResult;
- strResult.Format(_T("%.2f"), data.m_dResult1);
- SetDlgItemText(IDC_STATIC_RESULT1, strResult);
-
- strResult.Format(_T("%.2f"), data.m_dResult2);
- SetDlgItemText(IDC_STATIC_RESULT2, strResult);
- }
复制代码
4. 更新计算结果
在计算完成之后,要更新文档中的数据。
- void CMyProjectView::CalculateResults()
- {
- // 获取输入数据
- CString strText1, strText2;
- GetDlgItemText(IDC_EDIT1, strText1);
- GetDlgItemText(IDC_EDIT2, strText2);
- // 进行计算
- double dValue1 = _tstof(strText1);
- double dValue2 = _tstof(strText2);
- double dResult1 = dValue1 + dValue2;
- double dResult2 = dValue1 * dValue2;
- // 更新文档中的数据
- CMyProjectDoc* pDoc = GetDocument();
- ASSERT_VALID(pDoc);
-
- pDoc->GetProjectData().m_dResult1 = dResult1;
- pDoc->GetProjectData().m_dResult2 = dResult2;
-
- // 标记文档为已修改
- pDoc->SetModifiedFlag();
- // 显示计算结果
- CString strResult;
- strResult.Format(_T("%.2f"), dResult1);
- SetDlgItemText(IDC_STATIC_RESULT1, strResult);
-
- strResult.Format(_T("%.2f"), dResult2);
- SetDlgItemText(IDC_STATIC_RESULT2, strResult);
- }
复制代码
5. 添加菜单和工具栏支持
你可以在资源编辑器里添加 "保存项目" 和 "打开项目" 菜单项,并且关联到标准的 MFC 命令(ID_FILE_SAVE和ID_FILE_OPEN)。MFC 会自动处理这些命令,调用文档类的OnSaveDocument和OnOpenDocument函数。
实现要点
数据结构:CMyProjectData类负责保存项目的所有数据,并且实现Serialize函数。
文档序列化:文档类重写Serialize函数,调用项目数据的序列化函数。
数据同步:在保存项目前,要把界面数据同步到文档;加载项目后,要把文档数据同步到界面。
修改标记:数据发生变化时,调用SetModifiedFlag(),这样 MFC 就能提示用户保存修改。
通过上述步骤,你的 MFC 应用程序就能实现项目数据的保存和加载功能了。 |
|