基於MFC文檔/視圖架構,利用序列化機制持久化學生信息,界面需顯示表頭(姓名、性別、民族等)及數據列表。
// Student.h
class CStudent : public CObject {
DECLARE_SERIAL(CStudent)
public:
CString strName, strGender, strNation;
int nAge;
void Serialize(CArchive& ar) override {
if (ar.IsStoring()) ar << strName << strGender << strNation << nAge;
else ar >> strName >> strGender >> strNation >> nAge;
}
};
// StudentDoc.h
class CStudentDoc : public CDocument {
DECLARE_DYNCREATE(CStudentDoc)
protected:
CObList m_studentList; // 序列化容器
public:
CObList& GetList() { return m_studentList; }
void Serialize(CArchive& ar) override { m_studentList.Serialize(ar); }
};
// StudentView.h
class CStudentView : public CListView {
DECLARE_DYNCREATE(CStudentView)
protected:
void OnInitialUpdate() override {
CListView::OnInitialUpdate();
CListCtrl& list = GetListCtrl();
list.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);
// 插入表頭
list.InsertColumn(0, _T("姓名"), LVCFMT_LEFT, 100);
list.InsertColumn(1, _T("性別"), LVCFMT_CENTER, 60);
list.InsertColumn(2, _T("民族"), LVCFMT_LEFT, 80);
list.InsertColumn(3, _T("年齡"), LVCFMT_CENTER, 50);
}
void RefreshList() {
CListCtrl& list = GetListCtrl();
list.DeleteAllItems();
CStudentDoc* pDoc = GetDocument();
POSITION pos = pDoc->GetList().GetHeadPosition();
int nItem = 0;
while (pos) {
CStudent* pStu = (CStudent*)pDoc->GetList().GetNext(pos);
list.InsertItem(nItem, pStu->strName);
list.SetItemText(nItem, 1, pStu->strGender);
list.SetItemText(nItem, 2, pStu->strNation);
list.SetItemText(nItem, 3, std::to_wstring(pStu->nAge).c_str());
nItem++;
}
}
void OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint) override {
RefreshList(); // 文檔數據變更時自動刷新
}
};
MFC框架在`File → Save/Open`時自動調用`CDocument::Serialize`,進而調用`CObList::Serialize`,再調用每個`CStudent::Serialize`,無需手寫文件讀寫代碼。