嵌入式Linux操作系統(tǒng)第4章-1_第1頁
嵌入式Linux操作系統(tǒng)第4章-1_第2頁
嵌入式Linux操作系統(tǒng)第4章-1_第3頁
嵌入式Linux操作系統(tǒng)第4章-1_第4頁
嵌入式Linux操作系統(tǒng)第4章-1_第5頁
已閱讀5頁,還剩82頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

嵌入式Linux操作系統(tǒng)第4章嵌入式應(yīng)用程序設(shè)計

嵌入式應(yīng)用程序設(shè)計概述1MiniGUI概述2MiniGUI編程基礎(chǔ)3MiniGUI程序框架4第3章基于Linux的嵌入式軟件開發(fā)Qt編程基礎(chǔ)5信號和槽機制6圖形界面設(shè)計7使用Eclipse開發(fā)QT程序8Qt程序綜合實例9嵌入式應(yīng)用程序設(shè)計概述嵌入式操作系統(tǒng)有WindowsCE、PalmOS、Linux、VxWorks

、pSOS、QNX、OS-9、LynxOS等,已進(jìn)入我國市場的國外產(chǎn)品有WindRiver、Microsoft、QNX和Nuclear等。我國嵌入式操作系統(tǒng)的起步較晚,國內(nèi)此類產(chǎn)品主要是基于自主版權(quán)的Linux操作系統(tǒng),其中以中軟Linux、紅旗Linux、東方Linux為代表嵌入式應(yīng)用程序設(shè)計概述支撐軟件是用于幫助和支持軟件開發(fā)的軟件,通常包括數(shù)據(jù)庫和開發(fā)工具,其中以數(shù)據(jù)庫最為重要。嵌入式數(shù)據(jù)庫技術(shù)已得到廣泛的應(yīng)用,隨著移動通信技術(shù)的進(jìn)步,人們對移動數(shù)據(jù)處理提出了更高的要求,嵌入式數(shù)據(jù)庫技術(shù)已經(jīng)得到了學(xué)術(shù)、工業(yè)、軍事、民用部門等各方面的重視。國際上主要的嵌入式移動數(shù)據(jù)庫系統(tǒng)有Sybase、Oracle等。我國嵌入式移動數(shù)據(jù)庫系統(tǒng)以東軟集團(tuán)研究開發(fā)出了嵌入式數(shù)據(jù)庫系統(tǒng)OpenBASEMini為代表。嵌入式應(yīng)用程序設(shè)計概述嵌入式應(yīng)用軟件和普通應(yīng)用軟件有一定的區(qū)別,它不僅要求其準(zhǔn)確性、安全性和穩(wěn)定性等方面能夠滿足實際應(yīng)用的需要,而且還要盡可能地進(jìn)行優(yōu)化,以減少對系統(tǒng)資源的消耗,降低硬件成本。目前我國市場上已經(jīng)出現(xiàn)了各式各樣的嵌入式應(yīng)用軟件,包括瀏覽器、Email軟件、文字處理軟件、通訊軟件、多媒體軟件、個人信息處理軟件、智能人機交互軟件、各種行業(yè)應(yīng)用軟件等。嵌入式應(yīng)用程序設(shè)計概述嵌入式GUI為嵌入式系統(tǒng)提供了一種應(yīng)用于特殊場合的人們交互接口。嵌入式GUI要求簡單、直觀、可靠、占用資源小且反應(yīng)快速,以適應(yīng)系統(tǒng)硬件資源有限的條件。另外,由于嵌入式系統(tǒng)硬件本身的特殊性,嵌入式GUI應(yīng)具備高度可移植性與可裁減性,以適應(yīng)不同的硬件條件和使用需求嵌入式應(yīng)用程序設(shè)計概述嵌入式GUI具備以下特點體積??;運行時耗用系統(tǒng)資源?。簧蠈咏涌谂c硬件無關(guān),高度可移植;高可靠性;在某些應(yīng)用場合應(yīng)具備實時性。嵌入式應(yīng)用程序設(shè)計概述嵌入式GUI一般都采用分層結(jié)構(gòu)設(shè)計,可分為三層。在系統(tǒng)硬件之上的是圖形抽象層(GraphicsAbstractLayer,GAL)和輸入抽象層(InputAbstractLayer,IAL),這部分是和系統(tǒng)的硬件驅(qū)動程序緊密相關(guān)的;中間核心層是GUI最重要的部分,一般采用客戶機/服務(wù)器(Client/Server,C/S)模式運行,配合相應(yīng)的功能模塊,比如窗口管理模塊、時鐘管理模塊等來完成所需的服務(wù)器功能;最上的API層是GUI提供給用戶的編程接口。嵌入式應(yīng)用程序設(shè)計概述嵌入式應(yīng)用程序設(shè)計概述常用嵌入式GUI1.XWindow2.OpenGL3.MicroWindows4.MiniGUI5.QT/Embedded嵌入式應(yīng)用程序設(shè)計概述XWindow是Linux與其他類UNIX系統(tǒng)的標(biāo)準(zhǔn)GUI。XWindow采用標(biāo)準(zhǔn)的Server/Clinent體系結(jié)構(gòu),具有可擴(kuò)展性好、可移植性好等優(yōu)點。但該系統(tǒng)龐大、累贅、效率低,源代碼尚不開放,從而很難進(jìn)行本地化開發(fā)嵌入式應(yīng)用程序設(shè)計概述OpenGL。是“OpenGraphicsLibrary”的縮寫,即“開放的圖形程序接口”,是一個功能強大的底層圖形庫,提供調(diào)用方便的圖形程序接口。OpenGL的移植性好,可以在不同的平臺如Windows95、WindowsNT、UNIX、Linux、MacOS、OS/I之間進(jìn)行移植。在高端繪圖領(lǐng)域,OpenGL仍是不可替代的選擇。嵌入式應(yīng)用程序設(shè)計概述Microwindows提供了相對完善的圖形功能和一些高級的特性,如Alpha混合、三維支持和TrueType字體支持等。該系統(tǒng)為了提高運行速度,也改進(jìn)了基于Socket套接字的X實現(xiàn)模式,采用了基于消息機制的Server/Client傳輸機制。由于該項目缺乏一個強有力的核心代碼維護(hù)人員,2003年Microwindows推出版本0.90后,該項目的發(fā)展開始陷于停滯狀態(tài)嵌入式應(yīng)用程序設(shè)計概述MiniGUI是由國內(nèi)自由軟件開發(fā)人員設(shè)計開發(fā)的,目標(biāo)是為基于Linux的實時嵌入式系統(tǒng)提供一個輕量級的圖形用戶界面支持系統(tǒng)。后面的章節(jié)將會專門介紹。Qt/Embedded是著名的Qt庫開發(fā)商Trolltech公司開發(fā)的面向嵌入式系統(tǒng)的Qt版本。本書編寫時Qt最新版本為4.6.3。嵌入式應(yīng)用程序設(shè)計概述MiniGUI概述MiniGUI是由北京飛漫軟件技術(shù)有限公司主持的自由軟件,遵循LGPL條款。其目標(biāo)是為實時嵌入式Linux系統(tǒng)建立一個快速、穩(wěn)定和輕量級的圖形用戶界面支持系統(tǒng)。

MiniGUI的主要特色有:(1)遵循LGPL條款的純自由軟件;(2)提供了完備的多窗口機制,這包括多個單獨線程中運行的多窗口;(3)單個線程中主窗口的附屬;(4)對話框和預(yù)定義的控件類(按鈕、單行和多行編輯框、列表框、進(jìn)度條、工具欄等);(5)消息傳遞機制;MiniGUI概述(6)多字符集和多字體支持,目前支持IS08859.1、GB2312、Big5等字符集,并且支持各種光柵字體和TrueType、Type1等矢量字體;(7)全拼、五筆等漢字輸入法支持;(8)BMP、GIF、JPEG、PCX、TGA等常見圖像文件的支持;(9)Windows的資源文件支持,如位圖、圖標(biāo)、光標(biāo)等;(10)插入符、定時器、加速鍵等;(11)其他(Beep、ETC/INI文件操作等);(12)小巧,包含全部功能的庫文件大小為300KB左右:(13)可配置,可根據(jù)項目需求進(jìn)行定制配置和編譯;(14)高穩(wěn)定性和高性能,MiniGUI已經(jīng)在Linux發(fā)行版安裝程序、CNC系統(tǒng)、藍(lán)點嵌入式系統(tǒng)等關(guān)鍵應(yīng)用程序中得NT實際的應(yīng)用。MiniGUI概述MiniGUI有三種運行模式1.MiniGUI-Threads2.MiniGUI-Processes3.MiniGUI—StandaloneMiniGUI概述MiniGUI-Threads運行在MiniGUI-Threads上的程序可以在不同的線程中建立多個窗口,但所有的窗口在一個進(jìn)程者地址空間中運行。這種運行模式非常適合于大多數(shù)傳統(tǒng)意義上的嵌入式操作系統(tǒng),比如uC/OS-II、eCos、VxWorks、pSOS等當(dāng)然,在Linux和uClinux上,MiniGUI也能以MiniGUI-Threads方式運行。它是默認(rèn)的MiniGUI運行模式,本章后續(xù)內(nèi)容也是基于這種模式的。MiniGUI概述MiniGUI-Processes和MiniGUI-Threads相反,MiniGUI-Processes上的每個程序是獨立的進(jìn)程,每個進(jìn)程也可以建立多個窗口。MiniGUI-Processes適合于具有完整UNIX特性的嵌入式操作系統(tǒng),比如嵌入式Linux。在MiniGUI-Processes中可以同時運行多個MiniGUI應(yīng)用程序。首先要啟動一個服務(wù)器程序mginit,然后可以啟動其他作為客戶端運行的MiniGUI應(yīng)用程序。如果因為某種原因客戶端終止,服務(wù)器不受影響,可以繼續(xù)運行。MiniGUI概述MiniGUI—Standalone這種運行模式下,MiniGUI可以以獨立進(jìn)程的方式運行,既不需要多線程也不需要多進(jìn)程的支持,這種運行模式適合功能單一的應(yīng)用場合。比如在某些使用uClinux的嵌入式產(chǎn)品中,因為各種原因而缺少線程庫支持,這時,就可以使用MiniGUI-Standalone來開發(fā)應(yīng)用軟件MiniGUI概述MiniGUI概述MiniGUI分為最底層的GAL層和IAL層,向上為基于標(biāo)準(zhǔn)POSIX接口pthread庫的Mini-thread架構(gòu)和基于Server/Client的Mini-Lite架構(gòu)。Mini-thread架構(gòu)受限于thread模式對于整個系統(tǒng)的可靠性影響——進(jìn)程中某個thread的意外錯誤可能導(dǎo)致整個進(jìn)程的崩潰,該架構(gòu)應(yīng)用于系統(tǒng)功能較為單一的場合。Mini-Lite應(yīng)用于多進(jìn)程的應(yīng)用場合,采用多進(jìn)程運行方式設(shè)計的Server/Client架構(gòu)能夠較好地解決各個進(jìn)程之間的窗口管理、Z序剪切等問題。MiniGUI還有一種從Mini-Lite衍生出的standalone運行模式。該模式一次只能以窗口最大化的方式顯示一個窗口。這在顯示屏尺寸較小的應(yīng)用場合具有一定的應(yīng)用意義。MiniGUI概述MiniGUI的GAL層技術(shù)SVGAlib、LibGGI、基于framebuffer的native圖形引擎以及啞圖形引擎等,對于Trolltech公司的QVFB在XWindow下也有較好的支持。MiniGUI的IAL層則支持Linux標(biāo)準(zhǔn)控制臺下的GPM鼠標(biāo)服務(wù)、觸摸屏、標(biāo)準(zhǔn)鍵盤等。MiniGUI概述由于MiniGUI較好地將硬件設(shè)備抽象為GAL層和IAL層,移植時只需要針對自身的硬件特點按照GAL層調(diào)用接口和IAL層調(diào)用接口來做內(nèi)部實現(xiàn)即可。實現(xiàn)了framebuffer的Linux驅(qū)動后,配置MiniGUI選擇Native的GAL引擎,便可以使用framebuffer作為MiniGUI的圖形發(fā)生引擎。MiniGUI概述MiniGUI的IAL層將輸入設(shè)備的輸入事件最終映射為GUI系統(tǒng)API層的消息事件。IAL層默認(rèn)處理兩種設(shè)備的輸入操作:鍵盤設(shè)備和鼠標(biāo)設(shè)備。鍵盤設(shè)備向上層提供不同的按鍵輸入信息,鼠標(biāo)設(shè)備提供點擊、抬起和落筆坐標(biāo)等的信息。在實現(xiàn)MiniGUI與輸入設(shè)備驅(qū)動的接口時,采用Select的方式獲得輸入設(shè)備的動作,并轉(zhuǎn)換為消息隊列中的消息。消息參數(shù)按照Win32接口定義為點擊鍵編號或鼠標(biāo)當(dāng)前的坐標(biāo)(其中觸摸屏事件與鼠標(biāo)事件類似)。通過編寫針對硬件開發(fā)系統(tǒng)的IAL支持代碼,實現(xiàn)了IAL層的移植。MiniGUI概述MiniGUI中多字體和字符集支持是通過設(shè)備上下文(DC)的邏輯字體(LOGFONT)實現(xiàn)的,創(chuàng)建邏輯字體時指定相應(yīng)的字符集,其內(nèi)部實現(xiàn)為對于所需顯示字符的所屬字符集的識別處理,最終調(diào)用相應(yīng)字符集的處理函數(shù)族。應(yīng)用程序在啟動時,可切換系統(tǒng)字符集,如GB2312、BIG5、EUCKR、UJIS。MiniGUI的這種字符集支持方式不同于采用UNICODE的解決方案。在節(jié)省系統(tǒng)資源的意義上講,這種實現(xiàn)更加適合于嵌入式系統(tǒng)應(yīng)用,是MiniGUI的一大創(chuàng)新點。MiniGUI同時支持包括ttf、bdf、type1、vbf等多種字體格式,可以根據(jù)需要配置MiniGUI來支持相應(yīng)字體的顯示MiniGUI概述MiniGUI主要有1.6、2.0、3.0三個版本,目前,最新版本是MiniGUI-3.0.4??梢缘斤w漫公司官方網(wǎng)站http://下載源代碼:MiniGUI-3.0.4-Evaluation-Linux-PC.tar.gz,另外由于MiniGUI需要QT3.0.3以上版本的支持,所以我們還需要安裝QT3。MiniGUI概述為了便于說明安裝過程,我們統(tǒng)一將這2個文件放在目錄/root/miniGUI/3.0.4下。首先,我們安裝QT3:然后我們解壓MiniGUI的安裝包:[root@JLUZH3.0.4]#cd/root/miniGUI/3.0.4[root@JLUZH3.0.4]#rpm-ivqt3-devel-3.3.8b-25.fc11.i586.rpm[root@JLUZH3.0.4]#tar-zxvfMiniGUI-3.0.4-Evaluation-Linux-PC.tar.gzMiniGUI概述進(jìn)入解壓后的目錄,我們可以看到下面這些文件或目錄,接下來就是預(yù)安裝。執(zhí)行./install.sh將進(jìn)行預(yù)安裝,按<Ctrl+C>可以終止安裝,其他任意鍵繼續(xù)安裝。大家可以看到三個選項:--adp_inst_dir--src_inst_dir--minigui_runmode[root@JLUZH3.0.4]#cdMiniGUI-3.0.4-Evaluation-Linux-PC[root@JLUZHMiniGUI-3.0.4-Evaluation-Linux-PC]#lsREADMEdeplibsinstall.shmg3dmgplusmgutilsminiguixvfbMiniGUI概述選項adp_inst_dir表示指定庫的安裝路徑,默認(rèn)安裝路徑為/usr/local/目錄,我們這里指定目錄為/usr/local(這個目錄建議不要修改,否則需要修改環(huán)境變量);選項src_inst_dir表示指定組件及其依賴庫代碼解壓路徑,默認(rèn)解壓路徑為主目錄,比如使用的用戶名為test,那么解壓路徑為/home/test/目錄,這里我們指定目錄為/root/miniGUI/3.0.4/src;選項minigui_runmode表示指定您要安裝的MiniGUI

運行模式,默認(rèn)的MiniGUI

運行模式是進(jìn)程版(標(biāo)準(zhǔn)版和評估版中只有線程模式,因此無需此安裝選項)。MiniGUI概述安裝資源包的步驟如下:1.進(jìn)入MiniGUI

的資源路徑,我們已將MiniGUI

資源包安裝至/root/miniGUI/3.0.4/src/minigui-res-3.0.4目錄下。2.安裝MiniGUI

資源,默認(rèn)的安裝路徑是/usr/local,也可以通過參數(shù)--prefix來指定安裝路徑。下邊是將資源安裝到默認(rèn)路徑/usr/local下

[root@JLUZH/]cd/root/miniGUI/3.0.4/src/minigui-res-3.0.4[root@JLUZHminigui-res-3.0.4]#./configure--prefix=/usr/local[root@JLUZHminigui-res-3.0.4]#make[root@JLUZHminigui-res-3.0.4]#makeinstallMiniGUI概述3.編譯和安裝依賴庫在運行MiniGUI

之前,需要安裝MiniGUI

所需的依賴庫。除了在使用SVGALib

時需要第三方函數(shù)庫的支持外,MiniGUI

還使用了LibFreeType

、LibPNG、LibJPEG、LibZ

第三方的依賴庫。這些依賴庫都是使用GNUAutomake/Autoconf

腳本組織工程,通過在運行./configure命令時指定特定的環(huán)境變量及某些選項來完成這些庫的編譯和安裝。MiniGUI概述Libpng-1.2.30這樣PNG庫就會被安裝到/usr/local目錄下[root@JLUZHlibpng-1.2.30]#cd/root/miniGUI/3.0.4/src/libpng-1.2.30[root@JLUZHlibpng-1.2.30]#./configure--prefix=/usr/local[root@JLUZHlibpng-1.2.30]#make[root@JLUZHlibpng-1.2.30]#makeinstallMiniGUI概述jpeg-6bJPEG庫的安裝,首先進(jìn)入JPEG庫的源代碼目錄,安裝的具體步驟如下:[root@JLUZHjpeg-6b]#cd/root/miniGUI/3.0.4/src/jpeg-6b[root@JLUZHjpeg-6b]#./configure--prefix=/usr/local--enable-shared[root@JLUZHjpeg-6b]#make[root@JLUZHjpeg-6b]#makeinstallMiniGUI概述zlib-1.2.3Z庫的安裝,首先進(jìn)入Z庫的源代碼目錄,將Z庫就安裝到/usr/local目錄下。安裝的具體步驟如下[root@JLUZHzlib-1.2.3]#cd/root/miniGUI/3.0.4/src/zlib-1.2.3[root@JLUZHzlib-1.2.3]#./configure--prefix=/usr/local[root@JLUZHzlib-1.2.3]#make[root@JLUZHzlib-1.2.3]#makeinstallMiniGUI概述安裝qvfb2XWindow

的PC環(huán)境下,編譯和安裝qvfb2程序步驟如下[root@JLUZHqvfb2-2.0]#cd/root/miniGUI/3.0.4/src/qvfb2-2.0[root@JLUZHqvfb2-2.0]#./configure--prefix=/usr/local[root@JLUZHqvfb2-2.0]#make[root@JLUZHqvfb2-2.0]#makeinstallMiniGUI概述到此,MiniGUI的開發(fā)環(huán)境已經(jīng)搭建成功,大家可以編譯運行一個samples例子中的源程序:[root@JLUZHmg-samples-3.0.4]#cdroot/miniGUI/3.0.4/src/mg-samples-3.0.4[root@JLUZHmg-samples-3.0.4]#./configure[root@JLUZHmg-samples-3.0.4]#make[root@JLUZHmg-samples-3.0.4]#cdsame/[root@JLUZHsame]#./sameMiniGUI概述MiniGUI編程基礎(chǔ)MiniGUI

是Linux控制臺上運行的,基于SVGALib

和LinuxThread

庫的多窗口圖形用戶界面支持系統(tǒng)。MiniGUI

采用了類Win32的API接口,實現(xiàn)了簡化的類Windows98風(fēng)格的圖形用戶界面。圖形用戶界面在許多情況下都優(yōu)于字符界面,其最大的優(yōu)點是使應(yīng)用程序的操作簡單易學(xué)。MiniGUI編程基礎(chǔ)在MiniGUI

中,圖形用戶界面包括如下基本元素MiniGUI編程基礎(chǔ)MiniGUI

中的窗口基本分四類,分別為主窗口對話框控件主窗口中的窗片MiniGUI編程基礎(chǔ)MiniGUI

中的主窗口和Windows應(yīng)用程序的主窗口概念類似,但略微有些不同,MiniGUI

中的每個主窗口對應(yīng)于一個單獨的線程,通過函數(shù)調(diào)用可建立主窗口以及對應(yīng)的線程。每個線程有一個消息隊列,主窗口從這一消息隊列中獲取消息并由窗口過程(回調(diào)函數(shù))進(jìn)行處理。MiniGUI

中的對話框是一種特殊的窗口,對話框一般和控件一起使用,這兩個概念和Windows相關(guān)概念是類似的窗片是MiniGUI

所特有的,窗片實際是主窗口的子窗口,只存在于主窗口中。為了處理上的方便,主窗口的子窗口只以平鋪的形式出現(xiàn),因此我們將這種子窗口稱為“窗片”或“窗格”。窗片可以是私有的控件類型,也可以是標(biāo)準(zhǔn)的控件類型。MiniGUI編程基礎(chǔ)在Windows系列操作系統(tǒng)中,廣泛使用了消息驅(qū)動的概念。在MiniGUI中,我們也使用了消息驅(qū)動作為應(yīng)用程序的創(chuàng)建構(gòu)架MiniGUI中如下定義消息:typedef

struct

{

HWNDhwnd;

intmessage;

WPARAMwParam;

LPARAMlParam;

...

}MSG;MiniGUI編程基礎(chǔ)應(yīng)用程序一般要提供一個處理消息的標(biāo)準(zhǔn)函數(shù)。在消息循環(huán)中,系統(tǒng)可以調(diào)用此函數(shù),應(yīng)用程序在此函數(shù)中處理相應(yīng)消息MiniGUI編程基礎(chǔ)消息分為如下幾種類型:系統(tǒng)消息,為系統(tǒng)內(nèi)部管理使用。鼠標(biāo)消息,鼠標(biāo)的點擊、移動等產(chǎn)生的消息。鍵盤消息,鍵盤的按鍵消息。窗口消息,窗口管理消息。菜單消息,菜單管理消息。命令消息等。MiniGUI編程基礎(chǔ)窗口過程是用來處理窗口消息的函數(shù)過程。對于同一類型控件,其窗口過程一般是一樣的。因此,系統(tǒng)一般利用窗口的窗口類名來區(qū)分不同的窗口類并調(diào)用不同的窗口過程由于幾乎每一個主窗口均和其他窗口有著不同的窗口過程,因此,在MiniGUI

中,窗口類的概念只存在于控件和窗片中。對于主窗口來說,其窗口過程在建立主窗口時指定,而對控件和窗片來說,則在注冊窗口類時指定,而在建立窗片或控件時指定所屬窗口類。MiniGUI編程基礎(chǔ)句柄是MiniGUI

用來標(biāo)識對象的標(biāo)識符。句柄和指針概念類似,但它不一定是指針值。利用句柄,MiniGUI

將系統(tǒng)變量從應(yīng)用項目中分離了出來,因為程序員只能通過句柄訪問對象,因而就沒有利用指針是可能發(fā)生的因非法訪問而導(dǎo)致的數(shù)據(jù)不一致問題在MiniGUI

中,窗口、控件、設(shè)備環(huán)境、菜單、圖標(biāo)等均使用句柄訪問MiniGUI編程基礎(chǔ)控件可以理解為主窗口中的子窗口。這些子窗口的行為和主窗口一樣,即能夠接收鍵盤和鼠標(biāo)等外部輸入,也可以在自己的區(qū)域內(nèi)進(jìn)行輸出,只是它們的所有活動被限制在主窗口中。MiniGUI

也支持子窗口,并且可以在子窗口中嵌套建立子窗口。我們將MiniGUI

中的所有子窗口均稱為控件。MiniGUI編程基礎(chǔ)MiniGUI

提供了常用的預(yù)定義控件類,包括按鈕(包括單選鈕、復(fù)選鈕)、靜態(tài)框、列表框、進(jìn)度條、滑塊、編輯框等等。程序也可以定制自己的控件類,注冊后再創(chuàng)建對應(yīng)的實例。MiniGUI編程基礎(chǔ)MiniGUI

預(yù)定義的控件類和對應(yīng)類名稱如下表所示MiniGUI編程基礎(chǔ)對話框是一類特殊的主窗口,這種主窗口只關(guān)注與用戶的交互――向用戶提供輸出信息,但更多的是用于用戶輸入對話框分為模態(tài)和非模態(tài)對話框。簡單而言,模態(tài)對話框就是顯示之后,用戶不能再切換到其他主窗口進(jìn)行工作的對話框,而只能在關(guān)閉之后,才能使用其他的主窗口。MiniGUI編程基礎(chǔ)MiniGUI

中,使用DialogBoxIndirectParam

函數(shù)建立的對話框就是模態(tài)對話框。該對話框首先根據(jù)模板建立對話框,然后禁止其托管主窗口,并在主窗口的MSG_CREATE消息中創(chuàng)建控件,并發(fā)送MSG_INITDIALOG消息給回調(diào)函數(shù),最終建立一個新的消息循環(huán),并進(jìn)入該消息循環(huán),直到程序調(diào)用EndDialog

函數(shù)為止MiniGUI程序框架理解MiniGUI基本編程方法的最快途徑就是分析一個簡單程序的結(jié)構(gòu)。下面我們以一個MiniGUI版本的“HelloWorld!”程序來進(jìn)行說明。該程序在屏幕上創(chuàng)建一個大小為800×600像素的應(yīng)用程序窗口,并在窗口客戶區(qū)的中部顯示“HelloIamTeacherWen!”。MiniGUI程序框架#include<stdio.h>#include<minigui/common.h>#include<minigui/minigui.h>#include<minigui/gdi.h>#include<minigui/window.h>staticint

HelloWinProc(HWND

hWnd,intmessage,WPARAMwParam,LPARAMlParam){HDChdc;switch(message){caseMSG_PAINT:

hdc=BeginPaint(hWnd);

TextOut(hdc,40,60,"HelloIamTeacherWen!");

EndPaint(hWnd,hdc);return0;caseMSG_CLOSE:

DestroyMainWindow(hWnd);

PostQuitMessage(hWnd);return0;}returnDefaultMainWinProc(hWnd,message,wParam,lParam);}MiniGUI程序框架int

MiniGUIMain(int

argc,constchar*argv[]){MSGMsg;HWNDhMainWnd;MAINWINCREATECreateInfo;constchar*old_renderer;

#ifdef_MGRM_PROCESSES

JoinLayer(NAME_DEF_LAYER,"helloworld",0,0);#endif

CreateInfo.dwStyle=WS_VISIBLE|WS_BORDER|WS_CAPTION;

CreateInfo.dwExStyle=WS_EX_NONE;

CreateInfo.spCaption="HelloWorld";

CreateInfo.hMenu=0;

CreateInfo.hCursor=GetSystemCursor(0);

CreateInfo.hIcon=0;

CreateInfo.MainWindowProc=HelloWinProc;

CreateInfo.lx=0;

CreateInfo.ty=0;

CreateInfo.rx=240;

CreateInfo.by=180;MiniGUI程序框架

CreateInfo.iBkColor=COLOR_lightwhite;

CreateInfo.dwAddData=0;

CreateInfo.hHosting=HWND_DESKTOP;

old_renderer=SetDefaultWindowElementRenderer("skin");

hMainWnd=CreateMainWindow(&CreateInfo);if(hMainWnd==HWND_INVALID)return-1;

ShowWindow(hMainWnd,SW_SHOWNORMAL);

while(GetMessage(&Msg,hMainWnd)){

TranslateMessage(&Msg);

DispatchMessage(&Msg);}

SetDefaultWindowElementRenderer(old_renderer);

MainWindowThreadCleanup(hMainWnd);return0;}MiniGUI程序框架Helloworld.c的開始所包括四個頭文件,是所有的MiniGUI應(yīng)用程序都必須包括的頭義件Common.h:包括MiniGUl常用的宏以及數(shù)據(jù)類型的定義Minigui.h:包含了全局的和通用的接口函數(shù)以及某些雜項函數(shù)定義Gdi.h:包含了MiniGUI繪圖函數(shù)的接口定義Window.h:包含了窗口有關(guān)的宏、數(shù)據(jù)類犁、數(shù)據(jù)結(jié)構(gòu)定義以及函數(shù)接口聲明#include<stdio.h>#include<minigui/common.h>#include<minigui/minigui.h>#include<minigui/gdi.h>#include<minigui/window.h>MiniGUI程序框架使用預(yù)定義控件的MiniGUI應(yīng)用程序還必須包括另外一個頭義件<minigui/control.h>。control.h包含了libminigui中所有內(nèi)建控件的接口定義。MiniGUI程序框架一個C程序的入口點為main函數(shù),而一個MiniGUl程序的入口點為MiniGUlMain,該函數(shù)原型如下:int

MiniGUIMain(int

argc,constchar*argv[])

main函數(shù)已經(jīng)在MiniGUl的函數(shù)庫中定義了,該函數(shù)在進(jìn)行一些MiniGUI的初始化工作之后調(diào)用MiniGUlMain函數(shù)。所以,每個MiniGUI應(yīng)用程序(無論是服務(wù)器端程序mginit還是客戶端應(yīng)用程序)的入口點均為MiniGUIMain函數(shù)。參數(shù)argc和argv與C程序main函數(shù)的參數(shù)argc和argv含義是一樣的,分別為命令行參數(shù)個數(shù)和參數(shù)字符串?dāng)?shù)組指針MiniGUI程序框架3.MiniGUI-Processes模式下加入層4.創(chuàng)建和顯示主窗口#ifdef_MGRM_PROCESSES

JoinLayer(NAME_DEF_LAYER,"helloworld",0,0);#endifhMainWnd=CreateMainWindow(&CreateInfo);MiniGUI程序框架每個MiniGUl應(yīng)用程序的初始界面一般都是一個主窗口,你可以通過調(diào)用CreateMainWindow函數(shù)來創(chuàng)建一個主窗口,其參數(shù)是一個指向MAINWlNCREATE結(jié)構(gòu)的指針,本例中就是CreateInfo,返回值為所創(chuàng)建主窗口的句柄。MAINWlNCREATE結(jié)構(gòu)描述一個上主窗口的屬性,在使用CreateInfo創(chuàng)建主窗口之前,需要設(shè)置它的各項屬性。MiniGUI程序框架1.設(shè)置主窗口風(fēng)格,把窗口設(shè)為初始可見的,并具有邊框和標(biāo)題欄。CreateInfo.dwStyle=WS_VISIBLE|WS_BORDER|WS_CAPTION;2.設(shè)置窗口的擴(kuò)展風(fēng)格,該窗口沒有擴(kuò)展風(fēng)格。CreateInfo.dwExStyle=WS_EX_NONE;3.設(shè)置主窗口的標(biāo)題為“HelloWorld”。CreateInfo.spCaption="HelloWorld";4.設(shè)置主窗口的主菜單,該窗口沒有主菜單。CreateInfo.hMenu=0;MiniGUI程序框架5.設(shè)置主窗口的光標(biāo)為系統(tǒng)缺省光標(biāo)。CreateInfo.hCursor=GetSystemCursor(0);6.設(shè)置主窗口的圖標(biāo),該窗口沒有圖標(biāo)。CreateInfo.hIcon=0;7.設(shè)置豐窗口的窗口過程函數(shù)為HelloWinProc,所有發(fā)往該窗口的消息由該函數(shù)處理。CreateInfo.MainWindowProc=HelloWinProcMiniGUI程序框架8.設(shè)置豐窗口在屏幕上的位置,該窗口左上角位于(0,O),右下角位于(240,180)。CreateInfo.lx=0;CreateInfo.ty=0;CreateInfo.rx=240;CreateInfo.by=180;9.設(shè)置主窗口的背景色為白色,PIXEL_lighwhite是MiniGUl預(yù)定義的象素值。CreateInfo.iBkColor=COLOR_lightwhite;10.設(shè)置主窗口的附加數(shù)據(jù),該窗口沒有何附加數(shù)據(jù)。CreateInfo.dwAddData=0;MiniGUI程序框架11.設(shè)置主窗口的托管窗口為桌面窗口。CreateInfo.hHosting=HWND_DESKTOP;創(chuàng)建完主窗口之后,還需要調(diào)用ShowWindow函數(shù)才能把所創(chuàng)建的窗口顯示在屏幕上。SHowWindow的第一個參數(shù)為所要顯示的窗口句柄,第二個參數(shù)指明顯示窗口的方式(顯示還是隱藏),SW_SHOWNORMAL說明要顯示主窗口,并把它置為頂層窗口。MiniGUI程序框架在調(diào)用ShowWindow函數(shù)之后,主窗口就會顯示在屏幕上。和其它GUI一樣,現(xiàn)在是進(jìn)入消息循環(huán)的時候了。MiniGUI為每一個MiniGUl程序維護(hù)一個消息隊列。在發(fā)生事件之后,MiniGUI將事件轉(zhuǎn)換為一個消息,并將消息放入目標(biāo)程序的消息隊列之中。應(yīng)用程序現(xiàn)在的任務(wù)就是執(zhí)行如下的消息循環(huán)代碼,不斷地從消息隊列中取出消息,進(jìn)行處理:while(GetMessage(&Msg,hMainWnd)){

TranslateMessage(&Msg);

DispatchMessage(&Msg);}MiniGUI程序框架GetMessage函數(shù)調(diào)用從應(yīng)用程序消息隊列中取出一個消息該函數(shù)調(diào)用的第二個參數(shù)為要獲取消息的主窗口的句柄,第一個參數(shù)為一個指向MSG結(jié)構(gòu)的指針,GetMessage(&Msg,hMainWnd)MiniGUI程序框架GetMessage函數(shù)將用從消息隊列中取出的消息來填充該消息結(jié)構(gòu)的各個域,包括:hwnd:消息發(fā)往的窗口的句柄。在Helloworld.c程序中,該值與hMainWnd相同。message:消息標(biāo)識符。這是一個用于標(biāo)識消息的整數(shù)值。每一個消息均有一個對應(yīng)的預(yù)定義標(biāo)識符,這些標(biāo)識符定義在window.h頭文件中,以前綴MSG開頭。wPararm:一個32位的消息參數(shù),其含義和值根據(jù)消息的不同而不同。IParam:一個32位的消息參數(shù),其含義和值取決于消息的類型。time:消息放入消息隊列中的時間。

MiniGUI程序框架窗口過程函數(shù)是MiniGUI程序的主體部分,應(yīng)用程序?qū)嶋H所做的工作大部分都發(fā)生在窗口過程函數(shù)中,因為GUI程序的主要任務(wù)就是接收和處理窗口收到的各種消息。在helloworld.c程序中,窗口過程是名為HelloWinProc的函數(shù)。窗口過程函數(shù)可以由程序員任意命名CreateMainWindow函數(shù)根據(jù)MAINWlNCREATE結(jié)構(gòu)類型的參數(shù)中指定的窗口過程創(chuàng)建主窗口。窗口過程函數(shù)總是定義為如下形式:staticint

HelloWinProc(HWND

hWnd,intmessage,WPARAMwParam,LPARAMlParam)MiniGUI程序框架窗口過程的4個參數(shù)與MSG結(jié)構(gòu)的前四個域是相同的。第一個參數(shù)hWnd是接收消息的窗口的句柄,它與CreateMainWindow函數(shù)的返回值相同,該值標(biāo)識了接收該消息的特定窗口。第二個參數(shù)與MSG結(jié)構(gòu)中的message域相同,它是一個標(biāo)識窗口所收到消息的整數(shù)值。最后兩個參數(shù)都是32位的消息參數(shù),它提供和消息相關(guān)的特定信息。程序通常不直接調(diào)用窗口過程函數(shù),而是由MiniGUI進(jìn)行調(diào)用;也就是說,它是一個回調(diào)函數(shù)。MiniGUI程序框架程序在響應(yīng)MSG_PAINT消息時進(jìn)行屏幕輸出。應(yīng)用程序應(yīng)首先通過調(diào)用BeginPaint函數(shù)來獲得設(shè)備上下文句柄,并用它凋用GDI函數(shù)來執(zhí)行繪制操作。這里,程序使用TextOut文本輸出函數(shù)在客戶區(qū)的中部顯示了一個“HelloIamTeacherWen!”字符串。繪制結(jié)束之后,應(yīng)用程序調(diào)用EndPaint函數(shù)釋放設(shè)備上下文句柄。MiniGUI程序框架用戶單擊窗口右上角的關(guān)閉按鈕時窗口過程函數(shù)將收到一個MSG_CLOSE消息。程序在收到MSG_CLOSE消息時調(diào)用DestroyMainWindow函數(shù)銷毀主窗口,并且還調(diào)用PostQuitMessage函數(shù)在消息隊列中投入一個MSG_QUIT消息。當(dāng)GetMessage函數(shù)取出MSG_QUIT消息時將返回0,最終導(dǎo)致程序退出消息循環(huán)。MiniGUI程序框架輸入如下命令來編譯helloworld.c,并鏈接生成可執(zhí)行文件helloworld:-o選項:告訴gcc要生成的目標(biāo)文件名,這里是helloworld;-l選項:指定生成helloworId要鏈接的庫,這里鏈接的是minigui_ths庫,當(dāng)MiniGUI配置為MiniGUI-Threads時,還要鏈接pthread庫。pthread是提供POSIX兼容線程支持的函數(shù)庫,編譯MiniGUI-Threads程序時必須連接這個函數(shù)庫;其它要鏈接的jpeg、png、z等函數(shù)厙,則是MiniGUI內(nèi)部所依賴的函數(shù)庫。gcc-ohelloworld

helloworld.c-lminigui_ths-lpthread-lm-lpng-ljpegMiniGUI程序框架假定你將MiniGUI配置成MiniGUl-Processes,在運行helloworld程序之前。首先要確保已啟動了MiniGUI的服務(wù)器端程序mginit。比如你可以啟動MDE的mginit程序,然后進(jìn)入helloworld文件所在目錄,在命令行上輸入./helloworld啟動helloworld程序。MiniGUI程序框架mStudio

的中文全稱為“飛漫可視化軟件集成開發(fā)平臺”,是面向MiniGUI3.0的一款集成開發(fā)環(huán)境。mStudio

基于Eclipse集成開發(fā)環(huán)境開發(fā),并為用戶提供了所見即所得的界面設(shè)計工具,可自動生成和維護(hù)MiniGUI3.0的應(yīng)用程序框架,進(jìn)行代碼的編輯、編譯、運行、調(diào)試,從而加快MiniGUI3.0應(yīng)用程序的開發(fā),降低使用MiniGUI

的門檻。除此之外,我們還需要安裝Eclipse、MiniGUI和mGNCS,Eclipse需要3.4或以上版本,而MiniGUI則必須安裝最新的3.0.4版本,這兩個軟件的安裝已經(jīng)在前面的章節(jié)介紹了,下面我們將重點介紹mGNCS和mStudio安裝過程。首

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論