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