中國電波傳播研究所 王 平 楊麗麗
對(duì)某些采集設(shè)備而言,在相同條件下,同時(shí)顯示幾組的數(shù)據(jù)功能要求越來越多。為了研究設(shè)備性能,有時(shí)需要對(duì)關(guān)心的區(qū)域進(jìn)行重點(diǎn)顯示研究。這對(duì)顯示控件提出了更高的要求。
本文提供一種多組數(shù)據(jù)的繪制方法,采用自定義數(shù)據(jù)鏈表存儲(chǔ)顯示數(shù)據(jù),既可以實(shí)時(shí)加載顯示數(shù)據(jù),又可回放歷史數(shù)據(jù),可鼠標(biāo)選擇放大,鼠標(biāo)滑動(dòng)時(shí)也可顯示當(dāng)前鼠標(biāo)點(diǎn)數(shù)據(jù),顯示效率高,可行性強(qiáng),取得了理想效果。
本顯示控件采用動(dòng)態(tài)鏈表。動(dòng)態(tài)鏈表的結(jié)構(gòu)定義如下:
其中showdataarr是某時(shí)刻的組數(shù)據(jù),如果要顯示nSize組數(shù)據(jù),那么showdataarr 就是nSize維數(shù)組;obtime代表時(shí)間。obDATALIST數(shù)據(jù)按一定的時(shí)間間隔加載到數(shù)據(jù)列表showdataList中。
實(shí)時(shí)數(shù)據(jù)加載到鏈表后,觸發(fā)繪圖消息;在繪圖消息中處理數(shù)組數(shù)據(jù)鏈表,進(jìn)行各個(gè)組的坐標(biāo)轉(zhuǎn)化,實(shí)現(xiàn)繪圖更新。
本方法采用內(nèi)存繪圖,降低繪圖閃爍。
定義obDATALISTITEM類型的結(jié)構(gòu)體 showdata,初始化
obDATALISTITEM showdata;
memset(&showdata,0, sizeof(showdata));
進(jìn)行時(shí)間賦值,將數(shù)據(jù)的采集時(shí)間賦給結(jié)構(gòu)體
showdata.obtime = obtime;
進(jìn)行顯示數(shù)據(jù)賦值,對(duì)于顯示的nSize組數(shù)據(jù),先開辟內(nèi)存
data. showdataarr = new double [nSize];
將當(dāng)前時(shí)間獲取的nSize組數(shù)據(jù)賦值到結(jié)構(gòu)體的指針當(dāng)中
Memcpy(data. Showdataarr,ddata,sizeof(double)* nSize);
將數(shù)據(jù)obDATALISTITEM結(jié)構(gòu)體加載的緩沖鏈表,并隨時(shí)更新鏈表數(shù)據(jù)中的最大最小值,便于對(duì)Y軸的顯示范圍進(jìn)行自適應(yīng)。
繪圖主要工作是進(jìn)行坐標(biāo)轉(zhuǎn)換。
對(duì)選中的顯示區(qū)域,這個(gè)選中的區(qū)域,可以是正常的全部數(shù)據(jù),也可以是用戶關(guān)心的重點(diǎn)區(qū)域。
經(jīng)過區(qū)域的坐標(biāo)逆轉(zhuǎn)換,計(jì)算出當(dāng)前要顯示的數(shù)據(jù)的索引為:
開始索引:m_nStartindex
結(jié)束索引:m_nEndindex
顯示數(shù)據(jù)元素個(gè)數(shù):nChooseSize = m_nEndindex- m_nStartindex +1;
對(duì)nSize組顯示數(shù)據(jù)而言,利用for循環(huán),根據(jù)選擇的本組數(shù)據(jù)是否顯示,進(jìn)行nChooseSize
個(gè)數(shù)據(jù)的坐標(biāo)轉(zhuǎn)換并進(jìn)行繪制。
nSize為顯示數(shù)據(jù)的組數(shù)
nChooseSize 是每組數(shù)據(jù)的顯示數(shù)據(jù)長度
對(duì)于每組顯示數(shù)據(jù),用循環(huán)代碼繪圖
鼠標(biāo)在顯示區(qū)域選中某一塊,可關(guān)心區(qū)域進(jìn)行放大顯示。本功能的關(guān)鍵點(diǎn)是坐標(biāo)的逆轉(zhuǎn)換。
在鼠標(biāo)的OnLButtonDown函數(shù)中,獲取左上邊界。
在鼠標(biāo)的OnLButtonUp函數(shù)中,獲取右下邊界。
運(yùn)用坐標(biāo)逆轉(zhuǎn)換,獲取要顯示的數(shù)據(jù)索引m_nStartindex、m_nEndindex,以及縱軸坐標(biāo)m_fStartY、m_fEndY。
調(diào)用繪圖消息進(jìn)行繪圖,即可顯示選中的區(qū)域。
可以根據(jù)需要,點(diǎn)選需要選擇某組數(shù)據(jù),實(shí)現(xiàn)某些數(shù)據(jù)顯示,某些數(shù)據(jù)不顯示。將點(diǎn)選的結(jié)果,映射到BOOL型的數(shù)組m_bcheck[nSize]中,點(diǎn)選完畢之后,觸發(fā)繪圖函數(shù),即可根據(jù)選擇需要顯示數(shù)據(jù)。
本方法在VC++6.0開發(fā)環(huán)境下,進(jìn)行本多功能控件的繪圖實(shí)現(xiàn)。所繪多組數(shù)據(jù)圖如圖1所示:
圖1 某多組數(shù)據(jù)顯示控件顯示效果圖
由實(shí)驗(yàn)結(jié)果可以,本繪制方法,對(duì)多組線性數(shù)據(jù)有良好的展示效果,并可根據(jù)需要進(jìn)行點(diǎn)選顯示數(shù)據(jù),并可對(duì)關(guān)心區(qū)域進(jìn)行重點(diǎn)顯示。
[1]嚴(yán)蔚敏,吳偉您.?dāng)?shù)據(jù)結(jié)構(gòu)(C語言版)[M].清華大學(xué)出版社,2002∶44-63.
[2]孫鑫,等.VC++6.0深入詳解[M].電子工業(yè)出版社,2001∶404-434.