姚文利 李建慶
摘要:討論了一種可以節(jié)省內(nèi)存的繪制窗體背景界面的方法:實(shí)現(xiàn)了窗體無效后蔓繪先前背景的功能。
關(guān)鍵詞:圖形用戶界面WinCE.netNET精簡(jiǎn)框嵌入式系統(tǒng)
1.NET精簡(jiǎn)框中訪問圖形對(duì)象的方法
在顯示屏上繪圖,.NET精簡(jiǎn)框程序必須擁有Graphics類的一個(gè)實(shí)例。對(duì).NET精簡(jiǎn)框類的研究發(fā)現(xiàn),有兩種方法可以訪問Graphics對(duì)象:一種方法是調(diào)Paint事件,通過Paint事件中提供的PaintEventArgs參數(shù)的屬性訪問Graph-ics對(duì)象。它由系統(tǒng)發(fā)出,主要處理窗體中的繪圖,并通知一個(gè)窗體其內(nèi)容需要重繪;另一種方法是調(diào)用CreateCraphics函數(shù),利用調(diào)用返回的Graphics對(duì)象繪圖。雖然Create-Graphics方法名稱表示創(chuàng)建了一個(gè)Graphics對(duì)象,但事實(shí)上并非如此。它只是向窗體“租用”了Graphics對(duì)象,完成調(diào)用Graphics對(duì)象后必須調(diào)用Dispose方法返回對(duì)象。
2WinCE操作系統(tǒng)下基于VB.NET的窗體背景界面實(shí)現(xiàn)方法
在桌面系統(tǒng)中為窗體設(shè)計(jì)一個(gè)漂亮的界面,可以直接加入Picturebox控件,再將其屬性中的Image項(xiàng)修改為需要的圖片。采用這種方法,程序啟動(dòng)時(shí),圖片就顯示在背景窗體上,但讀取一幅圖片,需要消耗大量的內(nèi)存空間?;赩B.NET的界面程序,啟動(dòng)時(shí)本身需求的內(nèi)存空間就非??捎^,如果背景圖片所需內(nèi)存空間過大,可能會(huì)導(dǎo)致程序掛起。另外,考慮嵌入式系統(tǒng)頻率低、內(nèi)存少的自身特性,編寫好的應(yīng)用程序,應(yīng)盡量節(jié)省內(nèi)存空間。制作背景時(shí),我們采用的方法是調(diào)用繪圖函數(shù)。
繪制窗體背景通常有兩種方法。一種是使用窗體事件Form_Paint:另一種是使用重繪事件Onpaint。它們都提供PaintEventArgs參數(shù),利用該參數(shù)的屬性訪問Graphics對(duì)象,編寫繪圖代碼可以繪制窗體背景。由于這兩個(gè)Paint事件都是由系統(tǒng)發(fā)出的,當(dāng)窗體創(chuàng)建、隱藏、放大或縮小時(shí),它們都會(huì)自動(dòng)調(diào)用Paint函數(shù)中的代碼重繪。值得注意的是:繪制窗體背景時(shí),不能調(diào)用事件Form_Load。調(diào)用Form_Load事件繪制的窗體背景在窗體中一閃而過,不能長(zhǎng)時(shí)間停留,達(dá)不到顯示的效果。
OnPaint函數(shù)定義格式為Protected Overrides Sub On-Paint(ByVal e As PaintEventArgs)。Form_paint函數(shù)定義格式為Private Sub Form_Paint(ByVal sender As Obiect。By-Val e As System.Windows,F(xiàn)orms,PaintEventArgs)HandlesMyBase,Paint。利用e參數(shù)的屬性訪問Graphics對(duì)象,可以繪制線條、多邊形和各式文字。采用這種方法繪制的窗體背景所占用的內(nèi)存空間比讀取整幅圖片時(shí)少得多,正好符合嵌入式系統(tǒng)內(nèi)存少的特點(diǎn)。
3多個(gè)背景的窗體無效后重繪先前背景的實(shí)現(xiàn)方法
顯示屏是多任務(wù)、多線程操作系統(tǒng)WinCE的共享資源。為了避免程序間的沖突,同一時(shí)間系統(tǒng)只允許向顯示屏發(fā)出的一個(gè)Paint繪圖事件。創(chuàng)建、隱藏、滾動(dòng)、放大或縮小窗體和打開新文件都會(huì)使原來的窗體無效。窗體無效后,系統(tǒng)自動(dòng)調(diào)用Paint函數(shù)重繪窗體背景。但對(duì)于多個(gè)背景的窗體,窗體無效后,如何使Paint函數(shù)重繪無效前的背景是我們要解決的問題。
我們通過在OnPaint函數(shù)中設(shè)置旗幟變量實(shí)現(xiàn)了窗體無效后重繪先前背景功能。方法如下:
(1)創(chuàng)建一個(gè)圖形對(duì)象。定義格式如下:Dim gp A8Graphics=CreateGmphics():
(2)在主窗體中定義一個(gè)旗幟變量。根據(jù)不同情況設(shè)置特定枚舉值:
(3)使用條件語(yǔ)句判斷繪圖代碼。符合哪個(gè)枚舉值,就繪制相應(yīng)的背景。
下面舉例說明具體的實(shí)現(xiàn)方法。是一個(gè)窗體結(jié)構(gòu)示意圖。其中虛箭頭表示繪制窗體背景事件,實(shí)箭頭表示窗體無效事件。窗體無效后,繪制哪一個(gè)背景圖是我們要解決的問題。三個(gè)虛箭頭分別表示繪制聲音錄制、波形顯示和頻譜顯示的背景圖。我們?cè)谥鞔绑w中設(shè)定一個(gè)flag變量,標(biāo)識(shí)主窗體無效前的背景圖片。錄制聲音時(shí),flag的值置1;顯示波形時(shí),flag的值置2:顯示頻譜時(shí),flag的值置3。當(dāng)主窗體調(diào)用打開保存文件、輸入信息或顯示結(jié)果事件后,主窗體無效。這時(shí)系統(tǒng)將自動(dòng)調(diào)用OnPaint函數(shù),OnPaint函數(shù)根據(jù)flag的值,繪制窗體無效前的相應(yīng)背景。
4結(jié)束語(yǔ)
隨著嵌入式系統(tǒng)應(yīng)用領(lǐng)域的不斷擴(kuò)大,嵌入式系統(tǒng)開發(fā)需要考慮圖形用戶界面問題。我們?cè)赪inCE系統(tǒng)上開發(fā)語(yǔ)音頻譜分析儀時(shí),需要處理大量的圖形繪制問題。根據(jù)我們的實(shí)踐經(jīng)驗(yàn),總結(jié)出了一些實(shí)現(xiàn)圖形用戶界面的方法。通過調(diào)用paint函數(shù)繪制窗體背景,有效地節(jié)省了內(nèi)存空間;通過在OnPint函數(shù)中設(shè)置旗幟變量實(shí)現(xiàn)了窗體無效后重繪先前背景的功能。