第三課曾簡述 CChart 互動功能,本課深入剖析其底層運作,採用手動訊息處理方式,讓開發者完全掌控繪圖流程。
步驟 1-5 與第一課相同(建立 Lesson08、複製庫檔案)。關鍵差異在步驟 7:
static CChart chart; // 直接定義 CChart 而非 CChartWnd
這是核心變化:CChart 為核心繪圖類,不包含訊息處理包裝,需自行處理視窗訊息。
case WM_CREATE:
chart.SetType(kTypeXY);
chart.AddPoint2D(-3.0, 9.0);
chart.AddPoint2D(-2.0, 4.0);
chart.AddPoint2D(-1.0, 1.0);
chart.AddPoint2D(0.0, 0.0);
chart.AddPoint2D(1.0, 1.0);
chart.AddPoint2D(2.0, 4.0);
chart.AddPoint2D(3.0, 9.0);
chart.SetTitle(_T("另一個 CChart 程序!"));
break;
省去 GetChart() 呼叫,直接操作 chart 物件。
case WM_PAINT:
// 原有 DrawText 註解或刪除
chart.OnDraw(hdc, rt);
break;
case WM_ERASEBKGND:
return 0; // 防止背景重繪閃爍
將關鍵訊息轉交 CChart::Interactive 處理:
case WM_LBUTTONDOWN:
case WM_LBUTTONUP:
case WM_LBUTTONDBLCLK:
case WM_MOUSEMOVE:
case WM_CONTEXTMENU:
case WM_KEYDOWN:
case WM_SIZE:
case WM_ERASEBKGND:
chart.Interactive(hWnd, message, wParam, lParam);
break;
執行後滑鼠互動功能完整恢復,效果與第一課完全一致。
CChartWnd 實際上是包含訊息處理的 CChart 包裝類。手動處理方式雖多寫幾行代碼,但靈活度更高,便於整合至既有架構。