首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

MFC 對話框日記本:序列化儲存、鏈表管理與工具列整合

     編輯:關於VC++

專案架構

  • 基於對話框的 MFC EXE
  • 資料結構:CMyDiary (日期、星期、天氣、正文)
  • 容器:CTypedPtrList (指標鏈表,配合序列化)
  • 持久化:CArchive / CFile 序列化至 diary.dia
  • UI:工具列 (新增/儲存/刪除/導航)、日期選擇、天氣下拉、多行編輯框

核心類別定義


class CMyDiary : public CObject { // 繼承 CObject 才能序列化
    DECLARE_SERIAL(CMyDiary)
public:
    CTime m_TDate;
    CString m_strWeek, m_strWeather, m_strBody;
    CMyDiary() { m_TDate = 0; m_strWeek = m_strWeather = m_strBody = ""; }
    void Serialize(CArchive& ar) {
        if (ar.IsStoring()) {
            ar << m_TDate << m_strWeek << m_strWeather << m_strBody;
        } else {
            ar >> m_TDate >> m_strWeek >> m_strWeather >> m_strBody;
        }
    }
};
IMPLEMENT_SERIAL(CMyDiary, CObject, 1)

typedef CTypedPtrList CMyDiaryList;

應用程式類別管理資料與檔案 I/O


class CDiaryApp : public CWinApp {
    CMyDiaryList m_DiaryList;
public:
    void OnSave() { // 儲存
        CFile file;
        if (file.Open("diary.dia", CFile::modeCreate | CFile::modeWrite)) {
            CArchive ar(&file, CArchive::store);
            m_DiaryList.Serialize(ar); // 列表序列化會遞迴呼叫每個元素 Serialize
            ar.Close(); file.Close();
        }
    }
    void OnRead() { // 載入
        CFile file;
        if (file.Open("diary.dia", CFile::modeRead)) {
            CArchive ar(&file, CArchive::load);
            m_DiaryList.Serialize(ar);
            ar.Close(); file.Close();
        }
    }
    CMyDiaryList& GetList() { return m_DiaryList; }
};

對話框操作邏輯

  • 新增:建立 CMyDiary*、填入控制項資料、m_DiaryList.AddTail(pNew)、更新列表顯示
  • 刪除:取得選取項索引、POSITION pos = m_DiaryList.FindIndex(idx)、delete m_DiaryList.GetAt(pos)、m_DiaryList.RemoveAt(pos)
  • 導航:雙擊列表 / 上下鍵 → 取得對應 CMyDiary* → 填入編輯控制項
  • 關閉程式:自動呼叫 OnSave()

工具列整合技巧

  1. 資源建立工具列 (IDR_TOOLBAR),按鈕 ID 對應命令 (ID_FILE_NEW, ID_FILE_SAVE...)
  2. OnInitDialog:m_wndToolBar.CreateEx(this, TBSTYLE_FLAT) → LoadToolBar(IDR_TOOLBAR) → RecalcLayout() → RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0)
  3. 訊息映射 ON_COMMAND(ID_FILE_NEW, OnNew) 等連結處理函式

安全性與改進方向

原始碼結構

Diary/
├── Diary.cpp/h          // App 類別、序列化 I/O
├── DiaryDlg.cpp/h       // 主對話框、工具列、UI 邏輯
├── MyDiary.cpp/h        // CMyDiary 定義
├── Resource.h / .rc     // 對話框、工具列、圖示
└── diary.dia            // 執行期產生資料檔

歡迎下載原始碼修改擴充,交流請寄 wuhran@126.com / QQ 115418021。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
現狀風險改進
純文字儲存記事本可直接閱讀/修改序列化前 AES 加密 / 壓縮
單檔案損壞即全失備份機制 / SQLite 資料庫
無多使用者無權限控制登入驗證 / 加密鎖定