架構概覽
- Document:持有數據
CString m_text,負責序列化。
- View:
OnDraw 繪製 pDC->TextOut(0,0,m_text)。
- Dialog:輸入文本,
DoModal 返回更新 Document。
- Frame:菜單命令觸發對話框、保存文件。
關鍵代碼
1. Document (MyDoc.h/.cpp)
class CMyDoc : public CDocument {
DECLARE_DYNCREATE(CMyDoc)
public:
CString m_text;
virtual BOOL OnNewDocument() { m_text.Empty(); return TRUE; }
virtual void Serialize(CArchive& ar) {
if (ar.IsStoring()) ar << m_text;
else ar >> m_text;
}
};
2. View (MyView.cpp)
void CMyView::OnDraw(CDC* pDC) {
CMyDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
pDC->TextOut(10, 10, pDoc->m_text);
}
3. 輸入對話框 (InputDlg.h/.cpp)
class CInputDlg : public CDialog {
CString m_input;
// DDX_Text(pDX, IDC_EDIT1, m_input);
virtual void OnOK() { UpdateData(TRUE); CDialog::OnOK(); }
};
4. Frame 菜單處理 (MainFrm.cpp)
void CMainFrame::OnEditInput() {
CInputDlg dlg;
if (dlg.DoModal() == IDOK) {
CMyDoc* pDoc = (CMyDoc*)GetActiveDocument();
pDoc->m_text = dlg.m_input;
pDoc->UpdateAllViews(NULL); // 觸發 OnDraw
}
}
void CMainFrame::OnFileSave() {
CFileDialog dlg(FALSE, _T("txt"), NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT);
if (dlg.DoModal() == IDOK) {
CFile file(dlg.GetPathName(), CFile::modeCreate | CFile::modeWrite);
CArchive ar(&file, CArchive::store);
((CMyDoc*)GetActiveDocument())->Serialize(ar);
ar.Close(); file.Close();
}
}
擴展建議
- 使用
CString::Format 支持多行文本繪製(DrawText + DT_WORDBREAK)。
- 文件過濾器設置
_T("文本文件(*.txt)|*.txt|所有文件(*.*)|*.*||")。
- 新建文檔時調用
OnNewDocument 清空 m_text。