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

VC++6.0 TeeChart 控件動態繪圖問題:Button 事件中 Series 1 曲線不顯示的排查

     編輯:程式設計綜合問答

在 VC++6.0 MFC 專案中使用 TeeChart 控件(m_ctrlChart、m_ctrlChart1)繪製碳溫曲線時,開發者遇到一個經典問題:OnInitDialog 中初始化的隨機測試曲線(Series 0)正常顯示,但在 OnButton1 點擊事件中計算並嘗試繪製的實際業務曲線(Series 1)卻完全不顯示。程式碼邏輯看似正確,實則隱藏著幾個關鍵細節錯誤。

核心問題定位

  1. Series 索引錯誤導致覆蓋
    程式碼中先 AddSeries(0) 建立 Series 0,隨後又 AddSeries(1) 建立 Series 1。但在 OnButton1 中操作 Series(1) 時,前序程式碼已對 Series(0) 和 Series(1) 做過多次 Clear() 與屬性設定,導致索引對應關係混亂。TeeChart 的 Series 集合是 0-based,動態增刪會改變索引,建議用 Series[0] 或給 Series 設定 Name 後用名稱存取。
  2. 繪圖座標系統不匹配
    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。
  3. 迴圈終止條件邏輯錯誤
    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);。
  4. 雙圖表操作混淆
    程式碼同時操作 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();
}

避坑總結

  • TeeChart 系列索引極不穩定,**務必用名稱或指標管理系列**,不要依賴整數索引。
  • 動態繪圖前**必須重置座標軸範圍**或啟用自動縮放,否則新資料可能超出可視區。
  • 複雜數學迴圈的終止條件**務必用邊界測試驗證**,避免邏輯反向導致無限迴圈或零次執行。
  • 雙圖表同邏輯操作時,**提取共用函式**減少複製貼上錯誤。

掌握這些細節,VC++6.0 下的 TeeChart 動態繪圖即可穩定呈現預期曲線,助力冶金、化工等工業監控介面開發。

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