首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

MFC SDI 程序:對話框輸入、文件讀寫、視圖繪製完整骨架

     編輯:程式設計綜合問答

架構概覽

  • 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。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved