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

MFC 單文檔程序啟動時在狀態欄顯示時間:為何在 CWinApp 構造函數初始化?

     編輯:程式設計綜合問答

代碼流程回顧

  1. CMyApp::CMyApp() 構造函數 → 獲取系統時間 → 格式化字符串 → 存入成員變量 m_strStartupTime。
  2. CMainFrame::OnCreate() → 從 AfxGetApp() 取得 CMyApp* → 讀取 m_strStartupTime → m_wndStatusBar.SetPaneText(0, str)。

為何放在 App 構造函數?

  • 單例且最早執行:CWinApp 派生類為進程級單例,其構造函數在 WinMain → AfxWinMain → CWinApp::InitApplication 之前調用,早於任何窗口創建。
  • 邏輯集中:啟動時間屬於「應用程序級」數據,非某個窗口專屬,存放於 App 類語義清晰。
  • 避免重複計算:若放在 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)。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved