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

MFC 靜態分割窗口視圖間通信:文檔指針 vs 全局變量 vs 消息郵箱

     編輯:程式設計綜合問答

題主用 `CDocument` 指針傳遞數據並 `UpdateAllViews` 刷新,求「不帶刷新」的替代方案。

方案對比

方案原理優點缺點
Document 指針 (現狀)數據存在 Doc,視圖讀寫 + UpdateAllViewsMFC 內建、自動佈局刷新強制全視圖重繪、耦合 Doc 類
全局變量 / 單例`CMyData::Instance()->Set/Get()`簡單、無刷新、隨時讀寫全局狀態難測試、線程安全需自理
視圖指針直接調用`((CMyView*)pView)->OnDataUpdate(data)`精確控制目標視圖、無廣播需維護視圖指釖、類型轉換
自定義消息 (WM_USER+)`PostMessage(WM_MY_DATA, wParam, lParam)`解耦、跨線程安全、隊列緩衝需定義消息結構、處理函數
觀察者模式 (事件總線)`EventBus::Fire(DataEvent)` / 訂閱完全解耦、可擴展、單元測試友好引入額外框架/代碼

推薦:自定義消息 + 指針傳遞 (輕量、MFC 原生)

// 定義
#define WM_USER_DATA_UPDATE (WM_USER + 100)
struct ViewData { int type; void* pData; size_t len; };

// 發送方 (視圖 A)
ViewData* pData = new ViewData{1, buffer, len};
AfxGetMainWnd()->PostMessage(WM_USER_DATA_UPDATE, 0, (LPARAM)pData);

// 接收方 (視圖 B 消息映射)
ON_MESSAGE(WM_USER_DATA_UPDATE, OnDataUpdate)
LRESULT CMyView::OnDataUpdate(WPARAM, LPARAM lParam) {
    ViewData* p = (ViewData*)lParam;
    // 處理 p->pData
    delete p; // 記得釋放
    return 0;
}
  • **無 `UpdateAllViews`**,精確送達目標視圖 (或廣播 `AfxGetApp()->GetMainWnd()->SendMessageToDescendants`)。
  • 跨線程安全 (PostMessage 進消息隊列)。
  • 數據所有權轉移給接收方 (用 `new`/`delete` 或 `shared_ptr`)。

題主最終採用「全局變量 + 句柄傳遞 + 手動刷新」,雖可行但**全局變量反模式**,建議遷移至自定義消息或觀察者模式。

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