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