題主用 `CDocument` 指針傳遞數據並 `UpdateAllViews` 刷新,求「不帶刷新」的替代方案。
| 方案 | 原理 | 優點 | 缺點 |
|---|---|---|---|
| Document 指針 (現狀) | 數據存在 Doc,視圖讀寫 + UpdateAllViews | MFC 內建、自動佈局刷新 | 強制全視圖重繪、耦合 Doc 類 |
| 全局變量 / 單例 | `CMyData::Instance()->Set/Get()` | 簡單、無刷新、隨時讀寫 | 全局狀態難測試、線程安全需自理 |
| 視圖指針直接調用 | `((CMyView*)pView)->OnDataUpdate(data)` | 精確控制目標視圖、無廣播 | 需維護視圖指釖、類型轉換 |
| 自定義消息 (WM_USER+) | `PostMessage(WM_MY_DATA, wParam, lParam)` | 解耦、跨線程安全、隊列緩衝 | 需定義消息結構、處理函數 |
| 觀察者模式 (事件總線) | `EventBus::Fire(DataEvent)` / 訂閱 | 完全解耦、可擴展、單元測試友好 | 引入額外框架/代碼 |
// 定義
#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;
}
題主最終採用「全局變量 + 句柄傳遞 + 手動刷新」,雖可行但**全局變量反模式**,建議遷移至自定義消息或觀察者模式。