MFC中繪製動態曲線

2021-09-02 05:36:33 字數 2914 閱讀 2839

在工控監測領域,經常需要動態繪製曲線,觀察曲線的變化趨勢,繪製波形圖,繪製頻譜等。在前面4講中介紹了mfc經常用的teechart控制項和hight-speed

chart ctrl,這兩個都是mfc繪圖控制項的經典(另外,在qt中還有qwtplot和qcustomplot兩大神器)。許多人問如何繪製動態變化的曲線,為此專門寫下這篇文章。

c++ gui 繪圖控制項目錄

對於任何繪圖控制項,都可以實現動態繪圖,其原則是:控制項只負責繪圖,若想曲線動,就讓資料動,就像看電影一樣,電影是由一幀一幀的靜態組合起來的,在一定速度上重新整理,靜態就能動起來;和電影的原理一樣,繪圖控制項能顯示靜態的曲線,想要它動起來,就讓它頻在一定時間重新整理就可以了

這就是動態繪圖的實現原理。

實現動態曲線需要以下兩個準備:

計時器timer

陣列左移

基於timer的繪圖

任何介面庫都會有timer這個實現,在mfc中時ontimer訊息,在qt中是qtimer類,那種原理基本都一樣,下面將以mfc(vc)為例進行說明。

timer是訊息級別最低的訊息,它會保證其它級別高的訊息優先執行,因此,就算資料大量重新整理,也不會影響主線程的其它訊息。

mfc生成ontimer訊息,訊息響應函式如下:

[cpp]view plain

copy

void cteechartdlg::ontimer(uint_ptr nidevent)  

繪圖的實現就在這個訊息響應函式裡

如果讓定時器設定為1秒觸發,每一秒把舊資料去除,繪製新資料,就能看到不停變換的波形;對於趨勢圖,假如每秒有乙個新資料,那麼就在定長陣列中,把陣列所有資料整體左移,同時陣列末端加入新資料。**如下:

[cpp]view plain

copy

/// 

/// \brief 左移陣列

/// \param ptr 陣列指標

/// \param data 新數值

///void leftmovearray(double* ptr,size_t length,double data)  

ptr[length-1] = data;  

}  

此函式把整個陣列左移,然後新資料放置在陣列最末端(右端)。

這樣,陣列就實現「向左運動」,把左移後的陣列繪製,就能在繪圖控制項上發現其變化。

下面開始實現動態繪圖(這裡演示teechart的方法,附件裡有hightspeed-chart cchartctrl的方法):

[cpp]view plain

copy

void cteechartdlg::onbnclickedbuttonruning()  

m_count = m_c_arraylength;  

cseries chart_t = (cseries)m_chart.series(0);  

chart_t.clear();  

m_plineserie->clearserie();  

settimer(0,1000,null);    

}  

函式中幾個成員變數的定義是:

[cpp]view plain

copy

double m_teechartarray[2096];  

double m_x[2096];  

unsigned int m_count;  

const

size_t m_c_arraylength = 2096;  

m_teechartarray是需要繪製的陣列的y值,m_x是對應的x值,m_count是計數器,每繪製一次,個數加1,主要用於x軸

在timer中的實現如下:

[cpp]view plain

copy

void cteechartdlg::ontimer(uint_ptr nidevent)  

cdialogex::ontimer(nidevent);  

}  drawmoving函式用於繪圖,timer設定為1秒觸發一次,這時就能看到每秒的變化,如果資料是以1秒為重新整理周期,每一秒有個新資料,只需要把舊的資料向左移,新資料放到陣列最右端,再在繪圖控制項上把此圖形畫出來即可看的像動一樣。

drawmoving函式的實現如下:

[cpp]view plain

copy

void cteechartdlg::drawmoving()  

前面說過timer是優先順序最低的訊息,如果想曲線動的流暢,可以把時鐘設定為0ms,如

[cpp]view plain

copy

settimer(0,0,null);   

這時會在保證介面流暢的前提下,以最高頻率重新整理。這樣看到的圖形會非常流暢。

上面介紹的就是動態繪製曲線的思路和方法,附件中有用teechart實現和hightspeedchart實現的例子,考慮到可能有些人沒有安裝teechart,專門把teechart分離出來了乙個原始碼,只有hightspeedchart,不需要安裝任何控制項。

demo1:

mfc下teechart和hightspeedchart動態繪製曲線圖-vs2010

demo2(不用安裝任何控制項):

mfc動態繪製曲線圖-hightspeedchart實現

Qt繪製動態曲線

ifndef qlinewidget h define qlinewidget h include include include include include include include include include include include include include incl...

python繪製動態曲線教程

從txt種獲取資料 並且通過動態曲線顯示 import numpy as np import matplotlib.pyplot as plt import matplotlib.animation as animation import time fixing random state for r...

Matplotlib繪製動態實時曲線的方法改進

已有的解決方案 存在的問題 def method point es time np.zeros point fig plt.figure ax fig.add subplot 1,1,1 ax.axis equal 設定影象顯示的時候xy軸比例 ax.set xlabel horizontal po...