王 丹
(安徽理工大學計算機學院,安徽 淮南 232001)
基于嵌入式MINIGUI控件子類化技術的深入研究與應用
王 丹
(安徽理工大學計算機學院,安徽 淮南 232001)
文章討論一種MINIGUI控件子類化過程中的新方法。MINIGUI是一種有效的圖形用戶界面,子類化是對控件類的擴展。文章中提出了一種新的對于MINIGUI中控件子類化設計過程中數據保存的方法,該方法能有效的應用到MINIGUI的軟件開發中,從而提高MINIGUI系統在嵌入式應用當中的競爭力。
MINIGUI;控件;子類化;嵌入式
MINIGUI是GUI圖形界面系統中的一種,其開發的目的是為基于LINUX的實時嵌入式系統提供一個輕量級的圖形用戶界面支持系統。它為應用程序定義了一組輕量級的窗口和圖形設備接口。利用這些接口,每個應用程序可以建立多個窗口,而且可以在這些窗口中繪制圖形互不影響。用戶還可以利用MINIGUI建立菜單、按鈕、列表框等常見的GUI元素。利用MINIGUI足可以實現任何絢麗多姿的界面效果及交互應用。
在MINIGUI中子類化的方法有三種:1)對已經建立的控件實例進行子類化,子類化的結果只會影響一個控件實例。2)對某個控件類進行子類化,將影響其后創建的所有該控件累的控件實例;3)在某個控件類的基礎上新注冊一個子類化的控件類,不會影響原有控件類。
在MINIGUI庫中的struct_MAINWIN結構中有一些兩成員,如下:

MINIGUI中,dwAddData2是供控件實現中保存數據使用的,dwAddData則提供給用戶再次使用。由此可以肯定我們設計子類化控件的時候,子類化控件的數據不應該保存在dwAddData2中,如果保存在dwAddData2中,預定義控件中的數據就會丟失,而我們的子類化控件是基于預定義控件類或者控件實例基礎上的。為此,傳統設計方法中變量dwAddData則會成為我們的選擇。
子類化控件設計的應用非常廣泛,圖1即通過重載已有編輯框而實現的子類化控件的應用,在該應用中傳統方式設計的子類化控件得到了很好的應用,而且設計設計方法簡單。

圖 1
3.3.1 不足。傳統子類化設計滿足了簡單常規的應用,但是在復雜設計中,我們會遇到這樣的問題,當這樣的子類化控件與預定義控件進行內嵌使用時,往往會出現問題,原因就在于我們前面傳統方式設計中采用了用dwAddData保存子類化中的數據。
MINIGUI在設計時采用了在struct_MAINWIN結構中定義兩個附加數據變量來保存數據,其目的就是為了保證控件數據不被丟失,保證用戶不會使用內部數據,從而為用戶專門定義了一個變量來保存他們用到的數據。而二次開發者與應用開發者同樣是MINIGUI庫的使用者,從而導致了兩者之間對dwAdd-Data的重復使用。
3.3.2 改進與應用。在這里我們提出一種更加有效合理的方法:在內部控件中增加一個獲取內部保存在adddation2中的結構體變量大小的消息,供編寫外部擴展控件時使用,另外還得再window.h中增加這個消息的定義。該消息這里定義為MSG_GETPRIVATEDATASIZE。在編寫擴展控件時,MSG_CREATE消息中malloc一個指針內存,該內存大小為內部獲得的結構體變量大小與擴展控件的結構體變量大小之和,將這兩個結構體保存在p中,內部的在前,擴展的在后,并將p的內容保存在adddation2中,注意的是在取出原結構體變量內容后應free adddation2,再保存p的內容。當消息不是MSG_CREATE時,adddation2中取出的數據為p的內容,所以擴展控件要使用,p必須加上獲取的內部結構體大小,才是擴展控件中定義的結構體的地址。
以下代碼是基于spinbox子類化控件中的應用實現方法(部分代碼):


文章中提出的設計方法,有效的解決了多控件內嵌的問題,使開發人員可以方便的設計出令人滿意的,并且完美的子類化控件。
[1]北京飛漫軟件有限公司.MiniGUI編程指南[M].2006.
[2]北京飛漫軟件有限公司.MINIGUI用戶手冊[S].2006.
[3]北京飛漫軟件有限公司.MINIGUI技術白皮書[M].2006.
[4]楊宗德,鄧玉春.Linux高級程序設計(第2版).北京.人民郵電出版社,2009.
TP7
A