鱼C论坛

 找回密码
 立即注册
查看: 118|回复: 2

MFC 项目保存与加载

[复制链接]
发表于 2025-7-4 09:31:56 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
用MFC创建了应用程序。想实现的功能:与现在的一些软件一样,在点击保存项目时可以保存当前项目中所有数据,包括文本框中的输入的数据,以及计算的结果数据,下一次打开该项目,数据能自动加载。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2025-7-4 09:33:37 | 显示全部楼层
在 MFC 中实现项目保存与加载功能,推荐使用**文档-视图架构**(Document/View)。以下是简明实现步骤:

---

### 1. 在文档类存储数据
在 `CYourDoc.h` 中声明变量存储数据:
  1. class CYourDoc : public CDocument {
  2. public:
  3.     CString m_strInput;   // 存储文本框数据
  4.     double  m_dResult;    // 存储计算结果
  5.     // ... 其他数据成员
  6. };
复制代码


---

### 2. 重写文档序列化函数
在 `CYourDoc.cpp` 中实现 `Serialize()`:
  1. void CYourDoc::Serialize(CArchive& ar) {
  2.     if (ar.IsStoring()) { // 保存数据
  3.         ar << m_strInput;
  4.         ar << m_dResult;
  5.     } else { // 加载数据
  6.         ar >> m_strInput;
  7.         ar >> m_dResult;
  8.     }
  9. }
复制代码


---

### 3. 视图类与文档交互
在视图类 `CYourView.cpp` 中:
#### (1) 初始化时加载数据
  1. void CYourView::OnInitialUpdate() {
  2.     CView::OnInitialUpdate();
  3.     CYourDoc* pDoc = GetDocument();
  4.    
  5.     // 将文档数据加载到控件
  6.     m_editInput.SetWindowText(pDoc->m_strInput);
  7.    
  8.     CString strResult;
  9.     strResult.Format(_T("%.2f"), pDoc->m_dResult);
  10.     m_editResult.SetWindowText(strResult);
  11. }
复制代码


#### (2) 用户输入时更新文档
  1. void CYourView::OnEnChangeEditInput() {
  2.     CYourDoc* pDoc = GetDocument();
  3.    
  4.     // 更新文档数据
  5.     CString strInput;
  6.     m_editInput.GetWindowText(strInput);
  7.     pDoc->m_strInput = strInput;
  8.    
  9.     pDoc->SetModifiedFlag(TRUE); // 标记文档已修改
  10. }
复制代码


#### (3) 计算结果后保存到文档
  1. void CYourView::OnBnClickedCalculate() {
  2.     // ... 执行计算逻辑
  3.     double result = CalculateSomething();
  4.    
  5.     // 更新文档
  6.     CYourDoc* pDoc = GetDocument();
  7.     pDoc->m_dResult = result;
  8.     pDoc->SetModifiedFlag(TRUE);
  9. }
复制代码


---

### 4. 关键点说明
1. **自动保存提示**  
   调用 `SetModifiedFlag(TRUE)` 后,关闭文档时 MFC 会自动弹出保存提示。

2. **文件操作**  
   - 点击保存:自动调用 `Serialize()` 存储数据  
   - 点击打开:自动调用 `Serialize()` 加载数据  
   - 文件扩展名需在 `CYourApp::InitInstance()` 中注册

3. **控件变量**  
   通过 ClassWizard 为编辑框添加控件变量(如 `m_editInput`)。

---

### 示例工作流程
1. 用户输入数据 → 实时更新到 `CYourDoc`  
2. 用户点击保存 → MFC 自动触发 `Serialize()` 保存所有数据  
3. 重新打开文件 → `Serialize()` 加载数据 → `OnInitialUpdate()` 初始化界面

---

通过此设计,MFC 会自动处理文件对话框、读写流程等底层操作,您只需专注数据存储与界面同步。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-7-5 16:01:01 | 显示全部楼层
下面我将为你介绍如何在 MFC 应用程序里达成项目数据的保存与加载功能。我会分步骤说明实现方法,并且给出关键代码片段。
1. 数据结构设计
首先要设计一个类,用来保存项目的所有数据。
  1. class CMyProjectData
  2. {
  3. public:
  4.     CString m_strText1;      // 文本框1的数据
  5.     CString m_strText2;      // 文本框2的数据
  6.     double m_dResult1;       // 计算结果1
  7.     double m_dResult2;       // 计算结果2
  8.     // 可以根据实际需求添加更多的数据成员

  9. public:
  10.     // 序列化函数 - 把数据保存到归档文件
  11.     void Serialize(CArchive& ar);
  12. };

  13. void CMyProjectData::Serialize(CArchive& ar)
  14. {
  15.     if (ar.IsStoring())
  16.     {
  17.         // 保存数据
  18.         ar << m_strText1;
  19.         ar << m_strText2;
  20.         ar << m_dResult1;
  21.         ar << m_dResult2;
  22.     }
  23.     else
  24.     {
  25.         // 加载数据
  26.         ar >> m_strText1;
  27.         ar >> m_strText2;
  28.         ar >> m_dResult1;
  29.         ar >> m_dResult2;
  30.     }
  31. }
复制代码

2. 在文档类中添加项目数据成员
要在应用程序的文档类(继承自CDocument)里添加CMyProjectData对象。
  1. class CMyProjectDoc : public CDocument
  2. {
  3. protected:
  4.     CMyProjectData m_projectData;

  5. public:
  6.     // 访问项目数据的接口
  7.     CMyProjectData& GetProjectData() { return m_projectData; }
  8.     const CMyProjectData& GetProjectData() const { return m_projectData; }

  9.     // 重写序列化函数
  10.     virtual void Serialize(CArchive& ar);
  11. };

  12. void CMyProjectDoc::Serialize(CArchive& ar)
  13. {
  14.     // 调用项目数据的序列化函数
  15.     m_projectData.Serialize(ar);
  16. }
复制代码

3. 实现保存和加载功能
保存项目
在视图类或者对话框类中,可以借助文档对象来保存项目。
  1. void CMyProjectView::OnFileSave()
  2. {
  3.     // 获取文档对象
  4.     CMyProjectDoc* pDoc = GetDocument();
  5.     ASSERT_VALID(pDoc);

  6.     // 更新文档中的数据
  7.     CString strText1, strText2;
  8.     GetDlgItemText(IDC_EDIT1, strText1);
  9.     GetDlgItemText(IDC_EDIT2, strText2);
  10.    
  11.     pDoc->GetProjectData().m_strText1 = strText1;
  12.     pDoc->GetProjectData().m_strText2 = strText2;
  13.    
  14.     // 触发文档的保存操作
  15.     pDoc->OnSaveDocument(NULL);
  16. }
复制代码

加载项目
在视图类或者对话框类中,可以通过文档对象加载项目。
  1. void CMyProjectView::OnInitialUpdate()
  2. {
  3.     CView::OnInitialUpdate();
  4.    
  5.     // 加载文档数据
  6.     LoadDocumentData();
  7. }

  8. void CMyProjectView::LoadDocumentData()
  9. {
  10.     // 获取文档对象
  11.     CMyProjectDoc* pDoc = GetDocument();
  12.     ASSERT_VALID(pDoc);

  13.     // 从文档中获取数据
  14.     const CMyProjectData& data = pDoc->GetProjectData();

  15.     // 更新界面
  16.     SetDlgItemText(IDC_EDIT1, data.m_strText1);
  17.     SetDlgItemText(IDC_EDIT2, data.m_strText2);
  18.    
  19.     // 显示计算结果
  20.     CString strResult;
  21.     strResult.Format(_T("%.2f"), data.m_dResult1);
  22.     SetDlgItemText(IDC_STATIC_RESULT1, strResult);
  23.    
  24.     strResult.Format(_T("%.2f"), data.m_dResult2);
  25.     SetDlgItemText(IDC_STATIC_RESULT2, strResult);
  26. }
复制代码

4. 更新计算结果
在计算完成之后,要更新文档中的数据。
  1. void CMyProjectView::CalculateResults()
  2. {
  3.     // 获取输入数据
  4.     CString strText1, strText2;
  5.     GetDlgItemText(IDC_EDIT1, strText1);
  6.     GetDlgItemText(IDC_EDIT2, strText2);

  7.     // 进行计算
  8.     double dValue1 = _tstof(strText1);
  9.     double dValue2 = _tstof(strText2);
  10.     double dResult1 = dValue1 + dValue2;
  11.     double dResult2 = dValue1 * dValue2;

  12.     // 更新文档中的数据
  13.     CMyProjectDoc* pDoc = GetDocument();
  14.     ASSERT_VALID(pDoc);
  15.    
  16.     pDoc->GetProjectData().m_dResult1 = dResult1;
  17.     pDoc->GetProjectData().m_dResult2 = dResult2;
  18.    
  19.     // 标记文档为已修改
  20.     pDoc->SetModifiedFlag();

  21.     // 显示计算结果
  22.     CString strResult;
  23.     strResult.Format(_T("%.2f"), dResult1);
  24.     SetDlgItemText(IDC_STATIC_RESULT1, strResult);
  25.    
  26.     strResult.Format(_T("%.2f"), dResult2);
  27.     SetDlgItemText(IDC_STATIC_RESULT2, strResult);
  28. }
复制代码





5. 添加菜单和工具栏支持
你可以在资源编辑器里添加 "保存项目" 和 "打开项目" 菜单项,并且关联到标准的 MFC 命令(ID_FILE_SAVE和ID_FILE_OPEN)。MFC 会自动处理这些命令,调用文档类的OnSaveDocument和OnOpenDocument函数。
实现要点
数据结构:CMyProjectData类负责保存项目的所有数据,并且实现Serialize函数。
文档序列化:文档类重写Serialize函数,调用项目数据的序列化函数。
数据同步:在保存项目前,要把界面数据同步到文档;加载项目后,要把文档数据同步到界面。
修改标记:数据发生变化时,调用SetModifiedFlag(),这样 MFC 就能提示用户保存修改。
通过上述步骤,你的 MFC 应用程序就能实现项目数据的保存和加载功能了。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-25 09:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表