在 VC++6.0 MFC 專案中使用 TeeChart 控件(m_ctrlChart、m_ctrlChart1)繪製碳溫曲線時,開發者遇到一個經典問題:OnInitDialog 中初始化的隨機測試曲線(Series 0)正常顯示,但在 OnButton1 點擊事件中計算並嘗試繪製的實際業務曲線(Series 1)卻完全不顯示。程式碼邏輯看似正確,實則隱藏著幾個關鍵細節錯誤。
AddSeries(0) 建立 Series 0,隨後又 AddSeries(1) 建立 Series 1。但在 OnButton1 中操作 Series(1) 時,前序程式碼已對 Series(0) 和 Series(1) 做過多次 Clear() 與屬性設定,導致索引對應關係混亂。TeeChart 的 Series 集合是 0-based,動態增刪會改變索引,建議用 Series[0] 或給 Series 設定 Name 後用名稱存取。OnInitDialog 中測試資料 X 值為 10, 20, 30...(k+=10),Y 值約 20~30。而 OnButton1 計算出的 i 從 100 開始遞增 100,X 軸範圍瞬間跳到 100~1400,但 GetAxis().GetLeft().SetMinMax(0,100) 僅設定 Y 軸,**X 軸範圍未自動調整**,導致曲線繪製在可視區外。需呼叫 GetAxis().GetBottom().SetMinMax(minX, maxX) 或啟用 SetAutomatic。while(fabs(wc-a14)<0.0002 || fabs(t-a13)<12 || i>1400) 邏輯應為「任一條件滿足即停止」,但 || 導致只要 i>1400 為真就會**繼續**迴圈(因條件為真時 while 繼續),實際應用 && 且取反,或改寫為 do { ... } while (fabs(wc-a14)>=0.0002 && fabs(t-a13)>=12 && i<=1400);。m_ctrlChart 和 m_ctrlChart1,但 Series 索引、顏色、標題設定交叉重複,極易搞錯對象。建議封裝 InitChart(TChart&, CString title, COLORREF color) 統一初始化。void CCccDlg::OnButton1() {
// ... 參數讀取與 Oxe/Rore 計算 ...
// 1. 統一初始化兩個圖表
auto SetupChart = [](TChart& chart, LPCTSTR yTitle, COLORREF seriesColor) {
chart.GetAspect().SetView3D(FALSE);
chart.GetAxis().GetLeft().GetTitle().SetCaption(yTitle);
chart.RemoveAllSeries(); // 清空所有系列
int idx = chart.AddSeries(scFastLine); // 使用快速線系列
chart.Series(idx).SetColor(seriesColor);
chart.Series(idx).GetXValues().SetDateTime(FALSE); // 數值軸
chart.GetAxis().GetBottom().SetAutomatic(TRUE); // X軸自動範圍
chart.GetAxis().GetLeft().SetAutomatic(TRUE); // Y軸自動範圍
};
SetupChart(m_ctrlChart, _T("碳含量/%"), RGB(0,100,110));
SetupChart(m_ctrlChart1, _T("溫度/℃"), RGB(255,0,0));
// 2. 修正迴圈條件與座標
long double i = 100;
if (Rore > 0) {
do {
long double wc = a4 + a8 * log(1 + (exp((a11-a4)/a8)-1) * exp(-10*a7*((i+a5*Rore)/a1)/a8));
long double t = a12 + a9*i/a1 + a10 - a6*Rore;
m_ctrlChart.Series(0).AddXY(i, wc, _T(""), RGB(0,100,110));
m_ctrlChart1.Series(0).AddXY(i, t, _T(""), RGB(255,0,0));
i += 100;
} while (fabs(wc-a14) >= 0.0002 && fabs(t-a13) >= 12 && i <= 1400);
} else {
// Rore <= 0 邏輯同理修正
}
// 3. 強制重繪
m_ctrlChart.Invalidate();
m_ctrlChart1.Invalidate();
}
掌握這些細節,VC++6.0 下的 TeeChart 動態繪圖即可穩定呈現預期曲線,助力冶金、化工等工業監控介面開發。