羅國平
(樂山師范學(xué)院 計算機科學(xué)學(xué)院,四川 樂山614000)
Wince智能設(shè)備中應(yīng)用程序繪制圖形時遇到繪圖數(shù)據(jù)量較大時一般繪圖需要較長的時間,在繪圖過程中往往需要刷新,即將原圖形擦除掉,重新繪制新的圖形,由于這一刷新過程中出現(xiàn)顏色對比度偏差較大,從而導(dǎo)致屏幕閃爍的現(xiàn)象,這種現(xiàn)象稱之為“屏閃”現(xiàn)象,這種“屏閃”現(xiàn)象嚴重影響智能設(shè)備繪圖視覺效果。Wince應(yīng)用程序常常采用VS2005 VC++開發(fā),而該程序是基于消息映射模式,系統(tǒng)窗體在響應(yīng)WM_PAINT消息的時候進行復(fù)雜的圖形處理,往往需要調(diào)用OnEraseBkgnd函數(shù)以背景顏色擦除繪圖區(qū)域,然后用新的顏色重新繪圖,窗體在重繪時由于頻繁擦除和重繪從而引起“屏閃”問題。這就是“屏閃”形成的機理,解決這一問題的有效方法就是采用雙緩沖技術(shù)。
在35kV高壓開關(guān)柜監(jiān)控系統(tǒng)中,常常遇到需要實時顯示母線溫升等重要數(shù)據(jù),這些數(shù)據(jù)需要及時以動態(tài)曲線的方式繪制在屏幕上以便于工作人員及時了解高壓開關(guān)柜母線溫升狀態(tài),并根據(jù)母線溫升的狀況作出相應(yīng)的判斷,本文將探討如何實現(xiàn)無屏閃繪圖的方法。
Wince智能設(shè)備環(huán)境下屏幕默認坐標映射方式與笛卡爾坐標系坐標映射是不同的,Wince智能設(shè)備屏幕的左上角為坐標原點,相對于坐標由左向右為正,反之則為負;相對坐標從上到下為正,反之則為負。在實際應(yīng)用中,Y=0時,X軸位置常??紤]有三種情況,第一種情況即Y=0,X軸位于Y軸正中,Y軸上半軸和下半軸剛好對稱,這種坐標系常常用于繪制正負半軸都有數(shù)據(jù)的曲線、如正弦、余弦曲線;第二種情況即Y=0,X軸位于屏幕上方,Y軸僅有負半軸,這種坐標系常常用于繪制僅有負數(shù)的曲線;第三種情況,即Y=0,X軸位于屏幕下方,Y軸僅有正半軸,這種坐標系常常用于繪制僅有正數(shù)的曲線。在實際的程序設(shè)計過程中,為了實現(xiàn)參數(shù)化設(shè)計,可以采用一個比例因子來動態(tài)控制Y=0時X軸的位置。這個動態(tài)因子理論上可以為0~1之間的任意小數(shù),但為了實用起見程序中只取0,0.5,1三個參數(shù),當比例因子為0的時候,表示Y=0,X軸位于頂部,系統(tǒng)只繪制Y軸的負半軸;當比例因子為0.5時,表示Y=0,X軸位置于屏幕繪圖區(qū)域中心,系統(tǒng)需要繪制Y軸的正半軸和負半軸,且兩半軸上下對稱;當比例因子為1時,表示Y=0,系統(tǒng)只繪制Y軸正半軸。實現(xiàn)這個功能的計算公式參見式(1)。
式(1)中m_nCenterY表示Y=0時,X軸位于屏幕上的縱坐標位置(單位:Pixel);m_rectCurve 表示繪圖矩形區(qū)域;m_dBase 表示 Y=0,X 軸位于屏幕位置參數(shù),實際取值為 0,0.5,1.0,當為 0時表示僅繪制 Y 軸負半軸,當為0.5時表示需要繪制Y軸正、負半軸,且兩個半軸對稱,當為1.0時表示僅需要繪制Y軸正半軸;m_dRange表示最大范圍,在此僅取值為100。
為了實現(xiàn)程序具有通用性,在設(shè)計的時候往往需要參數(shù)化設(shè)計、模塊化設(shè)計。因此,需要考慮幾種常用的笛卡爾坐標系,根據(jù)刻度奇偶個數(shù)不同柵格繪制需要分幾種情況進行處理。
(1)當坐標 Y=0 時,式(1)中 m_dBase=0.5,Y 軸正半軸和負半軸關(guān)于X軸對稱時,在這種情況下,為了便于稱呼,我們將大刻度稱為主刻度,大刻度內(nèi)的小刻度稱為子刻度,以下未經(jīng)過說明都這樣稱呼,在這種情況下,需要分奇數(shù)個主刻度和偶數(shù)個主刻度;如圖1所示,Y軸表示范圍0~100,有10個大刻度,每一個刻度表示的值為10,總共10個大刻度,大刻度中僅有5個小刻度,因此子刻度有5個。為了便于編寫程序,定義一個主刻度成員變量m_nYAxisScale,子刻度成員變量m_nSubYAxisScale,主刻度柵格畫筆成員變量m_MainGridPen,子刻度畫筆成員變量m_SubGridPen。
圖1 母線溫升曲線
當為偶數(shù)個主刻度時,以Y=0為柵格繪制參考起點,分上半軸和下半軸繪制。繪制Y軸正半軸柵格算法如下:
//繪制上半部分柵格
其中m_rectCurve表示繪制曲線有效區(qū)域,即圖1中藍色矩形框內(nèi)區(qū)域。m_dcGrid表示柵格繪圖內(nèi)存設(shè)備類,區(qū)域大小相當于整個灰色的矩形區(qū)域。 在上述程序算法中的判斷條件 “if(i%m_nSubYAxisScale==0)”巧妙地將主刻度柵格線和子刻度線算法相統(tǒng)一,在實際繪圖過程中,最大限度減少了柵格和柵格之間的累計誤差,從而最大程度地避免了刻度和刻度之間不均勻現(xiàn)象。
同樣對于Y軸負半軸算法可以類推,不同的是繪圖參考點是m_rectCurve.Bottom,因此將僅將上述算法中MoveTo函數(shù)和LineTo函數(shù)的第二個參數(shù)做相應(yīng)的修改,將“+i”改為“-i”。
當為奇數(shù)個主刻度時,以Y=0為柵格繪制參考起點,Y軸分上半軸和下半軸繪制。在這種情況下與偶數(shù)個主刻度區(qū)別在于,最后1/2個主刻度的處理上,而且這1/2個主刻度內(nèi)又要分偶數(shù)個子刻度和奇數(shù)個子刻度,因此算法相對復(fù)雜,為了簡單起見,同樣僅考慮Y軸正半軸的情況,對于負半軸可以如法炮制。由于是奇數(shù)個主刻度,Y軸正半軸和負半軸關(guān)于X軸對稱,在這種情況下,柵格繪制的參考點以m_nCenterY為準,此參數(shù)計算參見式(1)。柵格繪制算法如下:
//繪制上半部分
Y軸負半軸柵格與Y軸正半軸算法很相似,不同的是MoveTo和LineTo函數(shù)的第二個參數(shù)中“m_nCenterY-”改為“m_nCenterY+”即可。
(2)當坐標 Y=0 時,式(1)中 m_dBase=0 或 m_dBase=1 時,m_d Base=0表示僅繪制Y軸負半軸;m_dBase=1時表示僅繪制Y軸正半軸。這兩種情況實際上在繪制柵格算法上是一樣的。算法如下:
在實際程序設(shè)計中,動態(tài)繪圖涉及到背景,坐標、柵格、坐標刻度、坐標標簽等,這些圖形元素直接繪制到一個名叫m_dcGrid設(shè)備環(huán)境類中,動態(tài)曲線繪制m_dcLine設(shè)備環(huán)境類中,兩個圖形以SRCPAINT方式合并到同一個圖形中,然后通過內(nèi)存環(huán)境設(shè)備類(memDC)將現(xiàn)有的畫面拷貝到屏上,這樣不斷更新畫面,經(jīng)過兩級緩沖處理就消除了閃屏問題。
程序(2)表示把圖形拷貝到dcGrid設(shè)備環(huán)境類中,dcGrid設(shè)備環(huán)境類實際上繪制的是柵格及坐標軸以及坐標刻度,坐標標簽等;程序(3)表示把圖形拷貝到m_dcLine設(shè)備環(huán)境類中,m_dcLine緩沖實際上繪制的是動態(tài)曲線,系統(tǒng)將兩個圖形以SRCPAINT方式合成一張圖,然后經(jīng)由2級緩沖memDC內(nèi)存環(huán)境設(shè)備類,該圖形通過BitBlt函數(shù)將圖形從內(nèi)存拷貝到屏幕上,從而實現(xiàn)無屏閃繪圖。
該程序在35KV智能開關(guān)柜遠程控制項目中測試通過,在實際運行過程中,肉眼幾乎無法感受到一點屏閃跡象,程序運行目前運行正常,實踐證明這種算法比較合理,完全能夠解決智能設(shè)備中動態(tài)繪圖過程中遇到的屏閃問題。
[1]蔣柱蔥,謝云.基于嵌入式 WinCE與 MSP430單片機多串口通信設(shè)計[J].電子設(shè)計工程,2011,4,19(7).
[2]尚秋峰,陳于揚,姚國珍,李灝.基于Wince嵌入式內(nèi)核的新型電力參數(shù)實時測量系統(tǒng)[J].電力系統(tǒng)保護與控制,2010,38(22).
[3]汪兵,李存斌,陳鵬,等.EVC高級編程及其應(yīng)用開發(fā)(Embedded Visual C++嵌入式編程)[M].中國水利水電出版社,2005,3.
[4]周立功.ARM&WinCE實驗與實踐:基于 S3C2410[M].北京航空航天大學(xué)出版社,2007,7.