鄒 瑛
(四川司法警官職業(yè)學(xué)院 司法信息管理系,四川 德陽 618000)
MiniGUI 是一種面向嵌入式或?qū)崟r(shí)系統(tǒng)圖形用戶界面支持系統(tǒng)[1],可以運(yùn)行在任何POSIX 兼容平臺(tái)上,是一種面向?qū)崟r(shí)嵌入式系統(tǒng)的輕量級(jí)圖形界面支持系統(tǒng), 具有小巧、高效、可移植性好等特點(diǎn)[2]。
在嵌入式Linux下使用有時(shí)需要使用自定義的鍵盤對(duì)分頁內(nèi)子控件的鍵盤聚焦消息的處理不靈活,對(duì)于要求精美外觀的GUI系統(tǒng)該控件就必須重新設(shè)計(jì)。對(duì)此這里設(shè)計(jì)了自定義屬性頁控件以滿足多分頁內(nèi)子控件對(duì)鍵盤和鼠標(biāo)事件的消息處理和GUI外觀的重新繪制。
在功能上屬性頁支持多分頁顯示,每個(gè)分頁按鈕對(duì)應(yīng)一個(gè)分頁,當(dāng)點(diǎn)擊屬性頁上某個(gè)分頁按鈕,就會(huì)將當(dāng)前顯示分頁隱藏,將當(dāng)前顯示分頁重定向到最新點(diǎn)擊的分頁,然后再次顯示當(dāng)前分頁以此實(shí)現(xiàn)分頁的切換。
如圖1所示,采用交叉鏈表設(shè)計(jì)了屬性頁數(shù)據(jù)結(jié)構(gòu),所有分頁形成一級(jí)雙向鏈表(橫向),每個(gè)分頁下還擁有子控件二級(jí)雙向鏈表(縱向)。默認(rèn)第一個(gè)分頁為活動(dòng)分頁,其它分頁為隱藏狀態(tài),當(dāng)調(diào)用消息接口發(fā)送切換分頁的消息后,控件將把當(dāng)前分頁全部子控件(按子控件鏈表遍歷)隱藏,然后把要切換的目標(biāo)分頁全部子控件顯示出來,并更改目標(biāo)分頁索引為當(dāng)前活動(dòng)分頁索引。其結(jié)構(gòu)體代碼實(shí)現(xiàn)如下:
圖1 屬性頁數(shù)據(jù)結(jié)構(gòu)示意
屬性頁數(shù)據(jù)結(jié)構(gòu)的定義是為更好的管理其子控件和繪制控件外觀,都在內(nèi)部使用,無需公布給用戶,所以該結(jié)構(gòu)體定義可以放入控件實(shí)現(xiàn)頭文件PageControl_impl.h中,因此該消息接口定義可以放在PageControl.h文件中,控件的實(shí)現(xiàn)代碼PageControl.c中包含以上兩個(gè)頭文件,但用戶只需包含PageControl.h頭文件即可使用該控件。如下是公布在PageControl.h頭文件的主要接口消息定義:
通過以上消息接口,即可將隨時(shí)把一些控件添加到一個(gè)新的分頁去顯示,也可以隨時(shí)銷毀一個(gè)分頁。
定義好屬性頁控件的數(shù)據(jù)結(jié)構(gòu)后,需要分析其控件實(shí)現(xiàn)的消息處理流程才能定義其需要公布的消息處理接口[3]。如圖2所示,屬性頁控件在創(chuàng)建時(shí)先要處理MSG_CREATE消息,先創(chuàng)建控件結(jié)構(gòu)體變量pData,把該結(jié)構(gòu)體變量地址記錄到控件的附加數(shù)據(jù)成員pCtrl->dwAddData2里,就可以從pCtrl->dwAddData2中得到其指針[4];控件在初始化時(shí)調(diào)用函數(shù)GetWindowStyle(hwnd)來獲取該控件的類型風(fēng)格(dwStyle)。為了提高繪圖性能一般在非MSG_PAINT消息的處理中,可以直接調(diào)用GetClientDC獲取屬性頁控件HDC句柄,把有變化的區(qū)域進(jìn)行繪制。當(dāng)屬性頁控件被彈出窗口遮擋、其它消息中調(diào)用InvalidateRect函數(shù)或控件初始化時(shí)系統(tǒng)會(huì)發(fā)給該屬性頁控件一個(gè)MSG_PAINT消息[5],此時(shí)需要全面繪制。
圖2 屬性頁控件消息處理流程
文本使用交叉鏈表設(shè)計(jì)并實(shí)現(xiàn)了自定義屬性頁控件。將內(nèi)部數(shù)據(jù)結(jié)構(gòu)和外部消息接口分開,方便用戶使用。為了提高繪圖性能盡可能減少使用InvalidateRect函數(shù)產(chǎn)生MSG_PAINT消息,實(shí)現(xiàn)局部變化局部處理,這樣不但可以增加控件外觀的精美顯示,也不降低控件的性能。
[1] 北京飛漫軟件技術(shù)有限公司.MiniGUI 編程指南[EB/OL].(2003-10-03)[2011-02-13].http://read.pudn.com/downloads160/sourcecode/embed/720762/編程指南.pdf.
[2] 北京飛漫軟件技術(shù)有限公司.MiniGUI 用戶手冊(cè)[EB/OL].(2003-10-11)[2011-02-13].http://read.pudn.com/downloads143/doc/622754/MiniGUIV2.0.pdf.
[3] 陳周國,王勝銀,付國晴.基于Linux QT技術(shù)的遠(yuǎn)程監(jiān)控GUI設(shè)計(jì)[J].通信技術(shù),2009,42(12):234-236.
[4] 王文啟,韓秀玲,孫波.基于MiniGUI的多進(jìn)程圖形用戶界面的研究[J].微計(jì)算機(jī)信息, 2007,23(08):78-80.
[5] 王蕾,陳功新,陸玲,等.基于ARM-Linux的嵌入式系統(tǒng)GUI開發(fā)研究[J].微計(jì)算機(jī)信息,2009,23(29):122-124.