




版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度智慧物流平臺(tái)股權(quán)投資合同協(xié)議
- 2025年度無社保派遣員工勞動(dòng)合同
- 2025年度電子產(chǎn)品銷售兼職傭金結(jié)算合同
- 二零二五年度貓咪寵物美容學(xué)院加盟買賣協(xié)議
- 《物流系統(tǒng)分析》課件 6.3.1單節(jié)點(diǎn)選址模型1
- 高中家長(zhǎng)會(huì):家校攜手·共創(chuàng)明天課件-高一上學(xué)期家長(zhǎng)會(huì)
- 常年聘請(qǐng)法律顧問的合同
- 2025年遼寧貨運(yùn)從業(yè)資格證試題庫(kù)及答案
- 金秋助學(xué)發(fā)言稿
- 智能家居產(chǎn)品市場(chǎng)占有率表格
- 核心素養(yǎng)導(dǎo)向下的高中歷史大單元教學(xué)設(shè)計(jì)研究課題設(shè)計(jì)論證
- 員工入職登記表
- 2025屆高考語(yǔ)文二輪復(fù)習(xí)語(yǔ)文備考策略
- 部編版語(yǔ)文小學(xué)二年級(jí)下冊(cè)第一單元集體備課(教材解讀)
- 2020年同等學(xué)力申碩《計(jì)算機(jī)科學(xué)與技術(shù)學(xué)科綜合水平考試》歷年真題及答案
- 出生證警示教育培訓(xùn)
- 通信工程建設(shè)標(biāo)準(zhǔn)強(qiáng)制性條文匯編(2023版)-定額質(zhì)監(jiān)中心
- 高等傳熱學(xué)全冊(cè)課件
- (正式版)JBT 11270-2024 立體倉(cāng)庫(kù)組合式鋼結(jié)構(gòu)貨架技術(shù)規(guī)范
- 最全全國(guó)各省市縣名稱
- 2024年《滕王閣序》原文及翻譯
評(píng)論
0/150
提交評(píng)論