CMyApp::CMyApp() 構造函數 → 獲取系統時間 → 格式化字符串 → 存入成員變量 m_strStartupTime。CMainFrame::OnCreate() → 從 AfxGetApp() 取得 CMyApp* → 讀取 m_strStartupTime → m_wndStatusBar.SetPaneText(0, str)。CWinApp 派生類為進程級單例,其構造函數在 WinMain → AfxWinMain → CWinApp::InitApplication 之前調用,早於任何窗口創建。OnCreate,每次創建框架窗口(如 MDI 子窗口)都會重新取時間,語義錯誤。| 位置 | 可行性 | 缺點 |
|---|---|---|
CMainFrame::OnCreate | 可行 | 時間偏晚(窗口已創建),若有多框架窗口會不一致。 |
CMyApp::InitInstance | 推薦 | 更符合 MFC 流程,App 物件已構造,主窗口未創建,屬於「初始化」階段。 |
| 全局變量/單例 | 可行 | 破壞封裝,不符合 MFC 架構風格。 |
BOOL CMyApp::InitInstance() {
// ... 標準初始化 ...
SYSTEMTIME st; GetLocalTime(&st);
m_strStartupTime.Format(_T("%04d-%02d-%02d %02d:%02d:%02d"),
st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond);
// ...
}
InitInstance 是 MFC 應用初始化的標準入口,比構造函數更適合放置依賴 MFC 運行環境的代碼(如 CTime、CString)。