畫面圖形快速繪制技術(shù)設(shè)計(jì)_第1頁(yè)
畫面圖形快速繪制技術(shù)設(shè)計(jì)_第2頁(yè)
畫面圖形快速繪制技術(shù)設(shè)計(jì)_第3頁(yè)
畫面圖形快速繪制技術(shù)設(shè)計(jì)_第4頁(yè)
畫面圖形快速繪制技術(shù)設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩2頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、畫面圖形快速繪制技術(shù)設(shè)計(jì)在SCADA系統(tǒng)畫面顯示中,最重要的技術(shù)就是畫面圖形刷新技術(shù),如果按照教科書上,如MFC深入淺出中的列子來寫繪圖程序,圖元一多就會(huì)出現(xiàn)圖形繪制時(shí)存在著圖元繪制速度慢,使得畫面整屏刷新時(shí),在開發(fā)態(tài)會(huì)逐個(gè)顯示圖元,而運(yùn)行態(tài)出現(xiàn)白屏現(xiàn)象。如何對(duì)該缺陷進(jìn)行改進(jìn),具體工作內(nèi)容需根據(jù)實(shí)際情況而定,下面提出一種基本的畫面圖形快速繪制技術(shù),以供參考。       組態(tài)軟件要實(shí)現(xiàn)圖元的鼠標(biāo)交互繪制,并且在運(yùn)行中需對(duì)實(shí)時(shí)數(shù)據(jù)以比較高的頻率進(jìn)行屏幕動(dòng)態(tài)刷新顯示(一般每50ms刷新一次),因此,對(duì)畫面窗口繪制實(shí)現(xiàn)要求比較高,在此設(shè)計(jì)畫面窗口繪制

2、是以緩存與區(qū)域刷新兩種技術(shù)的組合來實(shí)現(xiàn)。       緩存技術(shù)是指在畫面窗口繪制過程中,不是直接將各圖元的繪制效果顯示在屏幕上,而是首先將窗口畫面以位圖形式保存到內(nèi)存,然后將各圖元繪制到該緩存中,最后將緩存中信息重新寫回畫面窗口,整體顯示,使得CRT不為每一個(gè)畫面的變化而進(jìn)行一次整屏刷新,從而實(shí)現(xiàn)畫面窗口的高速繪制。區(qū)域刷新技術(shù)是指在上述操作過程中只對(duì)當(dāng)前刷新區(qū)域進(jìn)行處理,如僅復(fù)制當(dāng)前區(qū)域內(nèi)屏幕信息到內(nèi)存,只對(duì)與當(dāng)前刷新區(qū)域相容或相交的圖元進(jìn)行繪制,從而進(jìn)一步提高畫面窗口的繪制速度。如何創(chuàng)建memDC的文章網(wǎng)上已經(jīng)很多,此次不再具體描

3、述。       在程序中,各函數(shù)通過逐階調(diào)用或消息通知運(yùn)行即可實(shí)現(xiàn)不同方式的畫面窗口繪制。如圖元操作函數(shù)調(diào)用Invalidate函數(shù)或CDrawView:InvalObj(this)函數(shù)即可實(shí)現(xiàn)實(shí)時(shí)顯示本次圖元變換操作效果;在視圖編輯函數(shù)中通過調(diào)用OnUpdate函數(shù)即可實(shí)現(xiàn)不同模式的畫面窗口繪制;在工程運(yùn)行過程中,動(dòng)畫對(duì)象也可實(shí)現(xiàn)對(duì)動(dòng)畫顯示區(qū)域的動(dòng)態(tài)刷新,而不需整屏刷新,避免了屏幕閃爍,提高系統(tǒng)運(yùn)行速度。建立畫面窗口繪制函數(shù)調(diào)用關(guān)系圖如圖1.1所示。      分析圖1.1畫面窗口

4、繪制函數(shù)調(diào)用關(guān)系圖,可以看到最終的繪制過程都由畫面視圖的OnDraw()函數(shù)匯總實(shí)現(xiàn),主要有兩個(gè)大支流,分別對(duì)應(yīng)InvalidateRect()函數(shù)和Invalidate()函數(shù),實(shí)現(xiàn)單個(gè)圖元的區(qū)域繪制和整屏重繪,這兩種繪制方式將根據(jù)不同情況而被應(yīng)用,以達(dá)到最快的畫面繪制效率。 單個(gè)圖元繪制    單個(gè)圖元繪制指在圖形開發(fā)/運(yùn)行時(shí),畫面視圖僅對(duì)變動(dòng)的圖元所占區(qū)域進(jìn)行重繪,主要是采用區(qū)域繪制與緩存技術(shù)的結(jié)合方式實(shí)現(xiàn)。如圖1.1所描述,單個(gè)圖元的繪制主要發(fā)生在圖元編輯操作和動(dòng)畫連接顯示。1.圖元編輯操作時(shí),通過邏輯模塊定位該圖元,調(diào)用本圖元類的Invalid

5、ate()函數(shù),宣布本圖元所在區(qū)域無效,調(diào)用畫面邏輯模塊:UpdateAllViews在圖元所在邏輯模塊的所有視圖中重繪本圖元,各視圖獲取該圖元指針,并重繪圖元所占區(qū)域;對(duì)于單個(gè)畫面視圖刷新,也可直接將本圖元指針傳給所在視圖,調(diào)用該視圖: InvalObj()函數(shù),重繪圖元所占區(qū)域。2. 運(yùn)行時(shí)進(jìn)行動(dòng)畫刷新時(shí),直接關(guān)聯(lián)數(shù)據(jù)改變,需要?jiǎng)赢嬎⑿碌膱D元指針傳給所在畫面視圖,調(diào)用該視圖: InvalObj()函數(shù),重繪圖元所占區(qū)域。這個(gè)過程可采用兩種方法,一種是在動(dòng)畫掃描時(shí),每掃描到一個(gè)關(guān)聯(lián)數(shù)據(jù)發(fā)生變化的動(dòng)畫對(duì)象,便在動(dòng)畫數(shù)據(jù)處理后,實(shí)現(xiàn)對(duì)應(yīng)圖元的重繪;另一種方法是全部掃描完該畫面視圖動(dòng)畫鏈表后對(duì)整屏

6、進(jìn)行重繪。二者各有優(yōu)缺點(diǎn),當(dāng)圖元重合度小或瞬間動(dòng)畫圖元少時(shí),采用第一種方式具有明顯速度優(yōu)勢(shì);但當(dāng)圖元重合度大時(shí),因單個(gè)圖元的繪是采用區(qū)域繪制技術(shù),將會(huì)造成實(shí)際繪制圖元數(shù)明顯大于畫面視圖的圖元總數(shù),此時(shí)采用第二種方式全屏繪制反而能保證刷新速度。局部刷新技術(shù)具體實(shí)現(xiàn)如下:每個(gè)圖元更新時(shí)調(diào)用pDC->InvalidataRect(m_sz),這個(gè)時(shí)候在畫面刷新時(shí)將獲得該刷新區(qū)域的剪裁區(qū),其中剪裁區(qū)分為region 和 clipRect,區(qū)別見下圖: 其中藍(lán)色的區(qū)域合集為region,用GetUpdateRgn獲得,紅色的區(qū)域?yàn)樗衦egion圍成的最小矩形區(qū),用dc.GetClipB

7、ox(clipBoxRect)獲得。在OnPaint函數(shù)中先獲得該畫面目前需要刷新的CRgn和Rect 代碼 /獲得所要刷新的區(qū)域 CRgn* pInvalidateRgn; CRgn rgnInvalidate; rgnInvalidate.CreateRectRgn( 0,0,0,0 ); int nRgnResult = this->GetUpdateRgn( &rgnInvalidate ); if ( nRgnResult != ERROR && nRgnResult != NULLREGION ) pInvalidateRgn = &

8、rgnInvalidate; else return; /獲得需要刷新的最小剪裁矩形CRect clipBoxRect; dc.GetClipBox(clipBoxRect); if( clipBoxRect.IsRectEmpty() ) if ( rgnInvalidate.GetSafeHandle() ) rgnInvalidate.DeleteObject(); return;   將pInvalidateRgn和clipBoxRect以及memDC傳入每個(gè)圖元的繪制函數(shù)中,繪制前先判斷該region和clipRect是否與該圖元的邊界有交集 Draw

9、/ <summary>/ 判斷是否與矩形相交,包括包含/ </summary> BOOL CLayer:IsIntersectsWith( const CRect& rect1,const CRect& rect2 ) return ( (rect1.left < (rect2.left + rect2.Width() && (rect1.top < (rect2.top + rect2.Height() && (rect2.left < (rect1.left + rect1.Width() &

10、& (rect2.top < (rect1.top + rect1.Height() );/ <summary>/ 圖層繪制函數(shù)/ </summary>void CLayer:Draw(CDC *pDC,CRect *pr,CRgn* pInvalidateRgn) int i; if(!m_enable) return ; int cnt = m_FigObjArray.GetSize(); BOOL bl=TRUE; for(i=0; i<cnt; i+) CObjBase *pFigObj = m_FigObjArray.GetAt(i); C

11、Rect pixelBounds(pFigObj->m_pt0,pFigObj->m_sz+CSize(1,1); /過濾不在剪裁區(qū)中的圖元 if (!IsIntersectsWith(pixelBounds,*pr) continue; /過濾不在刷新區(qū)域中的圖元 if (pInvalidateRgn) pDC->LPtoDP(&pixelBounds); if (!pInvalidateRgn->RectInRegion( pixelBounds ) continue; /只有在刷新區(qū)域內(nèi)的圖元才真正繪制 bl=pFigObj->DrawFig(pDC,bl);   最后將memDC的內(nèi)容貼到屏幕的DC上,完成繪圖 pDC->BitBlt(clipBoxRect.left,clipBoxRect.top,clipBoxRect.Width(),clipBoxRect.Height(),&mDC,0,0,SRCCOPY);  畫面整屏刷新畫面整屏刷新是指進(jìn)行畫面視圖重繪

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論