中國電波傳播研究所 王 平 楊麗麗
對某些采集設備而言,在相同條件下,同時顯示幾組的數據功能要求越來越多。為了研究設備性能,有時需要對關心的區域進行重點顯示研究。這對顯示控件提出了更高的要求。
本文提供一種多組數據的繪制方法,采用自定義數據鏈表存儲顯示數據,既可以實時加載顯示數據,又可回放歷史數據,可鼠標選擇放大,鼠標滑動時也可顯示當前鼠標點數據,顯示效率高,可行性強,取得了理想效果。
本顯示控件采用動態鏈表。動態鏈表的結構定義如下:

其中showdataarr是某時刻的組數據,如果要顯示nSize組數據,那么showdataarr 就是nSize維數組;obtime代表時間。obDATALIST數據按一定的時間間隔加載到數據列表showdataList中。
實時數據加載到鏈表后,觸發繪圖消息;在繪圖消息中處理數組數據鏈表,進行各個組的坐標轉化,實現繪圖更新。
本方法采用內存繪圖,降低繪圖閃爍。
定義obDATALISTITEM類型的結構體 showdata,初始化
obDATALISTITEM showdata;
memset(&showdata,0, sizeof(showdata));
進行時間賦值,將數據的采集時間賦給結構體
showdata.obtime = obtime;
進行顯示數據賦值,對于顯示的nSize組數據,先開辟內存
data. showdataarr = new double [nSize];
將當前時間獲取的nSize組數據賦值到結構體的指針當中
Memcpy(data. Showdataarr,ddata,sizeof(double)* nSize);
將數據obDATALISTITEM結構體加載的緩沖鏈表,并隨時更新鏈表數據中的最大最小值,便于對Y軸的顯示范圍進行自適應。
繪圖主要工作是進行坐標轉換。
對選中的顯示區域,這個選中的區域,可以是正常的全部數據,也可以是用戶關心的重點區域。
經過區域的坐標逆轉換,計算出當前要顯示的數據的索引為:
開始索引:m_nStartindex
結束索引:m_nEndindex
顯示數據元素個數:nChooseSize = m_nEndindex- m_nStartindex +1;
對nSize組顯示數據而言,利用for循環,根據選擇的本組數據是否顯示,進行nChooseSize
個數據的坐標轉換并進行繪制。
nSize為顯示數據的組數
nChooseSize 是每組數據的顯示數據長度
對于每組顯示數據,用循環代碼繪圖


鼠標在顯示區域選中某一塊,可關心區域進行放大顯示。本功能的關鍵點是坐標的逆轉換。
在鼠標的OnLButtonDown函數中,獲取左上邊界。
在鼠標的OnLButtonUp函數中,獲取右下邊界。
運用坐標逆轉換,獲取要顯示的數據索引m_nStartindex、m_nEndindex,以及縱軸坐標m_fStartY、m_fEndY。
調用繪圖消息進行繪圖,即可顯示選中的區域。
可以根據需要,點選需要選擇某組數據,實現某些數據顯示,某些數據不顯示。將點選的結果,映射到BOOL型的數組m_bcheck[nSize]中,點選完畢之后,觸發繪圖函數,即可根據選擇需要顯示數據。
本方法在VC++6.0開發環境下,進行本多功能控件的繪圖實現。所繪多組數據圖如圖1所示:

圖1 某多組數據顯示控件顯示效果圖
由實驗結果可以,本繪制方法,對多組線性數據有良好的展示效果,并可根據需要進行點選顯示數據,并可對關心區域進行重點顯示。
[1]嚴蔚敏,吳偉您.數據結構(C語言版)[M].清華大學出版社,2002∶44-63.
[2]孫鑫,等.VC++6.0深入詳解[M].電子工業出版社,2001∶404-434.