專案架構
- 基於對話框的 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()
工具列整合技巧
- 資源建立工具列 (IDR_TOOLBAR),按鈕 ID 對應命令 (ID_FILE_NEW, ID_FILE_SAVE...)
OnInitDialog:m_wndToolBar.CreateEx(this, TBSTYLE_FLAT) → LoadToolBar(IDR_TOOLBAR) → RecalcLayout() → RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0)
- 訊息映射
ON_COMMAND(ID_FILE_NEW, OnNew) 等連結處理函式
安全性與改進方向
| 現狀 | 風險 | 改進 |
| 純文字儲存 | 記事本可直接閱讀/修改 | 序列化前 AES 加密 / 壓縮 |
| 單檔案 | 損壞即全失 | 備份機制 / SQLite 資料庫 |
| 無多使用者 | 無權限控制 | 登入驗證 / 加密鎖定 |
原始碼結構
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。
- 上一篇文章: AppFace 庫從資源載入 URF 皮膚:三種載入方式與實戰技巧
- 下一篇文章: C++ 封裝 DHTML 表格操作元件:報表輸出的輕量級方案
Copyright ©
程式碼之家 All Rights Reserved