版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
嵌入式Linux操作系統第4章嵌入式應用程序設計
嵌入式應用程序設計概述1MiniGUI概述2MiniGUI編程基礎3MiniGUI程序框架4第3章基于Linux的嵌入式軟件開發Qt編程基礎5信號和槽機制6圖形界面設計7使用Eclipse開發QT程序8Qt程序綜合實例9嵌入式應用程序設計概述嵌入式操作系統有WindowsCE、PalmOS、Linux、VxWorks
、pSOS、QNX、OS-9、LynxOS等,已進入我國市場的國外產品有WindRiver、Microsoft、QNX和Nuclear等。我國嵌入式操作系統的起步較晚,國內此類產品主要是基于自主版權的Linux操作系統,其中以中軟Linux、紅旗Linux、東方Linux為代表嵌入式應用程序設計概述支撐軟件是用于幫助和支持軟件開發的軟件,通常包括數據庫和開發工具,其中以數據庫最為重要。嵌入式數據庫技術已得到廣泛的應用,隨著移動通信技術的進步,人們對移動數據處理提出了更高的要求,嵌入式數據庫技術已經得到了學術、工業、軍事、民用部門等各方面的重視。國際上主要的嵌入式移動數據庫系統有Sybase、Oracle等。我國嵌入式移動數據庫系統以東軟集團研究開發出了嵌入式數據庫系統OpenBASEMini為代表。嵌入式應用程序設計概述嵌入式應用軟件和普通應用軟件有一定的區別,它不僅要求其準確性、安全性和穩定性等方面能夠滿足實際應用的需要,而且還要盡可能地進行優化,以減少對系統資源的消耗,降低硬件成本。目前我國市場上已經出現了各式各樣的嵌入式應用軟件,包括瀏覽器、Email軟件、文字處理軟件、通訊軟件、多媒體軟件、個人信息處理軟件、智能人機交互軟件、各種行業應用軟件等。嵌入式應用程序設計概述嵌入式GUI為嵌入式系統提供了一種應用于特殊場合的人們交互接口。嵌入式GUI要求簡單、直觀、可靠、占用資源小且反應快速,以適應系統硬件資源有限的條件。另外,由于嵌入式系統硬件本身的特殊性,嵌入式GUI應具備高度可移植性與可裁減性,以適應不同的硬件條件和使用需求嵌入式應用程序設計概述嵌入式GUI具備以下特點體積小;運行時耗用系統資源小;上層接口與硬件無關,高度可移植;高可靠性;在某些應用場合應具備實時性。嵌入式應用程序設計概述嵌入式GUI一般都采用分層結構設計,可分為三層。在系統硬件之上的是圖形抽象層(GraphicsAbstractLayer,GAL)和輸入抽象層(InputAbstractLayer,IAL),這部分是和系統的硬件驅動程序緊密相關的;中間核心層是GUI最重要的部分,一般采用客戶機/服務器(Client/Server,C/S)模式運行,配合相應的功能模塊,比如窗口管理模塊、時鐘管理模塊等來完成所需的服務器功能;最上的API層是GUI提供給用戶的編程接口。嵌入式應用程序設計概述嵌入式應用程序設計概述常用嵌入式GUI1.XWindow2.OpenGL3.MicroWindows4.MiniGUI5.QT/Embedded嵌入式應用程序設計概述XWindow是Linux與其他類UNIX系統的標準GUI。XWindow采用標準的Server/Clinent體系結構,具有可擴展性好、可移植性好等優點。但該系統龐大、累贅、效率低,源代碼尚不開放,從而很難進行本地化開發嵌入式應用程序設計概述OpenGL。是“OpenGraphicsLibrary”的縮寫,即“開放的圖形程序接口”,是一個功能強大的底層圖形庫,提供調用方便的圖形程序接口。OpenGL的移植性好,可以在不同的平臺如Windows95、WindowsNT、UNIX、Linux、MacOS、OS/I之間進行移植。在高端繪圖領域,OpenGL仍是不可替代的選擇。嵌入式應用程序設計概述Microwindows提供了相對完善的圖形功能和一些高級的特性,如Alpha混合、三維支持和TrueType字體支持等。該系統為了提高運行速度,也改進了基于Socket套接字的X實現模式,采用了基于消息機制的Server/Client傳輸機制。由于該項目缺乏一個強有力的核心代碼維護人員,2003年Microwindows推出版本0.90后,該項目的發展開始陷于停滯狀態嵌入式應用程序設計概述MiniGUI是由國內自由軟件開發人員設計開發的,目標是為基于Linux的實時嵌入式系統提供一個輕量級的圖形用戶界面支持系統。后面的章節將會專門介紹。Qt/Embedded是著名的Qt庫開發商Trolltech公司開發的面向嵌入式系統的Qt版本。本書編寫時Qt最新版本為4.6.3。嵌入式應用程序設計概述MiniGUI概述MiniGUI是由北京飛漫軟件技術有限公司主持的自由軟件,遵循LGPL條款。其目標是為實時嵌入式Linux系統建立一個快速、穩定和輕量級的圖形用戶界面支持系統。
MiniGUI的主要特色有:(1)遵循LGPL條款的純自由軟件;(2)提供了完備的多窗口機制,這包括多個單獨線程中運行的多窗口;(3)單個線程中主窗口的附屬;(4)對話框和預定義的控件類(按鈕、單行和多行編輯框、列表框、進度條、工具欄等);(5)消息傳遞機制;MiniGUI概述(6)多字符集和多字體支持,目前支持IS08859.1、GB2312、Big5等字符集,并且支持各種光柵字體和TrueType、Type1等矢量字體;(7)全拼、五筆等漢字輸入法支持;(8)BMP、GIF、JPEG、PCX、TGA等常見圖像文件的支持;(9)Windows的資源文件支持,如位圖、圖標、光標等;(10)插入符、定時器、加速鍵等;(11)其他(Beep、ETC/INI文件操作等);(12)小巧,包含全部功能的庫文件大小為300KB左右:(13)可配置,可根據項目需求進行定制配置和編譯;(14)高穩定性和高性能,MiniGUI已經在Linux發行版安裝程序、CNC系統、藍點嵌入式系統等關鍵應用程序中得NT實際的應用。MiniGUI概述MiniGUI有三種運行模式1.MiniGUI-Threads2.MiniGUI-Processes3.MiniGUI—StandaloneMiniGUI概述MiniGUI-Threads運行在MiniGUI-Threads上的程序可以在不同的線程中建立多個窗口,但所有的窗口在一個進程者地址空間中運行。這種運行模式非常適合于大多數傳統意義上的嵌入式操作系統,比如uC/OS-II、eCos、VxWorks、pSOS等當然,在Linux和uClinux上,MiniGUI也能以MiniGUI-Threads方式運行。它是默認的MiniGUI運行模式,本章后續內容也是基于這種模式的。MiniGUI概述MiniGUI-Processes和MiniGUI-Threads相反,MiniGUI-Processes上的每個程序是獨立的進程,每個進程也可以建立多個窗口。MiniGUI-Processes適合于具有完整UNIX特性的嵌入式操作系統,比如嵌入式Linux。在MiniGUI-Processes中可以同時運行多個MiniGUI應用程序。首先要啟動一個服務器程序mginit,然后可以啟動其他作為客戶端運行的MiniGUI應用程序。如果因為某種原因客戶端終止,服務器不受影響,可以繼續運行。MiniGUI概述MiniGUI—Standalone這種運行模式下,MiniGUI可以以獨立進程的方式運行,既不需要多線程也不需要多進程的支持,這種運行模式適合功能單一的應用場合。比如在某些使用uClinux的嵌入式產品中,因為各種原因而缺少線程庫支持,這時,就可以使用MiniGUI-Standalone來開發應用軟件MiniGUI概述MiniGUI概述MiniGUI分為最底層的GAL層和IAL層,向上為基于標準POSIX接口pthread庫的Mini-thread架構和基于Server/Client的Mini-Lite架構。Mini-thread架構受限于thread模式對于整個系統的可靠性影響——進程中某個thread的意外錯誤可能導致整個進程的崩潰,該架構應用于系統功能較為單一的場合。Mini-Lite應用于多進程的應用場合,采用多進程運行方式設計的Server/Client架構能夠較好地解決各個進程之間的窗口管理、Z序剪切等問題。MiniGUI還有一種從Mini-Lite衍生出的standalone運行模式。該模式一次只能以窗口最大化的方式顯示一個窗口。這在顯示屏尺寸較小的應用場合具有一定的應用意義。MiniGUI概述MiniGUI的GAL層技術SVGAlib、LibGGI、基于framebuffer的native圖形引擎以及啞圖形引擎等,對于Trolltech公司的QVFB在XWindow下也有較好的支持。MiniGUI的IAL層則支持Linux標準控制臺下的GPM鼠標服務、觸摸屏、標準鍵盤等。MiniGUI概述由于MiniGUI較好地將硬件設備抽象為GAL層和IAL層,移植時只需要針對自身的硬件特點按照GAL層調用接口和IAL層調用接口來做內部實現即可。實現了framebuffer的Linux驅動后,配置MiniGUI選擇Native的GAL引擎,便可以使用framebuffer作為MiniGUI的圖形發生引擎。MiniGUI概述MiniGUI的IAL層將輸入設備的輸入事件最終映射為GUI系統API層的消息事件。IAL層默認處理兩種設備的輸入操作:鍵盤設備和鼠標設備。鍵盤設備向上層提供不同的按鍵輸入信息,鼠標設備提供點擊、抬起和落筆坐標等的信息。在實現MiniGUI與輸入設備驅動的接口時,采用Select的方式獲得輸入設備的動作,并轉換為消息隊列中的消息。消息參數按照Win32接口定義為點擊鍵編號或鼠標當前的坐標(其中觸摸屏事件與鼠標事件類似)。通過編寫針對硬件開發系統的IAL支持代碼,實現了IAL層的移植。MiniGUI概述MiniGUI中多字體和字符集支持是通過設備上下文(DC)的邏輯字體(LOGFONT)實現的,創建邏輯字體時指定相應的字符集,其內部實現為對于所需顯示字符的所屬字符集的識別處理,最終調用相應字符集的處理函數族。應用程序在啟動時,可切換系統字符集,如GB2312、BIG5、EUCKR、UJIS。MiniGUI的這種字符集支持方式不同于采用UNICODE的解決方案。在節省系統資源的意義上講,這種實現更加適合于嵌入式系統應用,是MiniGUI的一大創新點。MiniGUI同時支持包括ttf、bdf、type1、vbf等多種字體格式,可以根據需要配置MiniGUI來支持相應字體的顯示MiniGUI概述MiniGUI主要有1.6、2.0、3.0三個版本,目前,最新版本是MiniGUI-3.0.4。可以到飛漫公司官方網站http://下載源代碼:MiniGUI-3.0.4-Evaluation-Linux-PC.tar.gz,另外由于MiniGUI需要QT3.0.3以上版本的支持,所以我們還需要安裝QT3。MiniGUI概述為了便于說明安裝過程,我們統一將這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概述進入解壓后的目錄,我們可以看到下面這些文件或目錄,接下來就是預安裝。執行./install.sh將進行預安裝,按<Ctrl+C>可以終止安裝,其他任意鍵繼續安裝。大家可以看到三個選項:--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表示指定庫的安裝路徑,默認安裝路徑為/usr/local/目錄,我們這里指定目錄為/usr/local(這個目錄建議不要修改,否則需要修改環境變量);選項src_inst_dir表示指定組件及其依賴庫代碼解壓路徑,默認解壓路徑為主目錄,比如使用的用戶名為test,那么解壓路徑為/home/test/目錄,這里我們指定目錄為/root/miniGUI/3.0.4/src;選項minigui_runmode表示指定您要安裝的MiniGUI
運行模式,默認的MiniGUI
運行模式是進程版(標準版和評估版中只有線程模式,因此無需此安裝選項)。MiniGUI概述安裝資源包的步驟如下:1.進入MiniGUI
的資源路徑,我們已將MiniGUI
資源包安裝至/root/miniGUI/3.0.4/src/minigui-res-3.0.4目錄下。2.安裝MiniGUI
資源,默認的安裝路徑是/usr/local,也可以通過參數--prefix來指定安裝路徑。下邊是將資源安裝到默認路徑/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
時需要第三方函數庫的支持外,MiniGUI
還使用了LibFreeType
、LibPNG、LibJPEG、LibZ
第三方的依賴庫。這些依賴庫都是使用GNUAutomake/Autoconf
腳本組織工程,通過在運行./configure命令時指定特定的環境變量及某些選項來完成這些庫的編譯和安裝。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庫的安裝,首先進入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庫的安裝,首先進入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環境下,編譯和安裝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的開發環境已經搭建成功,大家可以編譯運行一個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編程基礎MiniGUI
是Linux控制臺上運行的,基于SVGALib
和LinuxThread
庫的多窗口圖形用戶界面支持系統。MiniGUI
采用了類Win32的API接口,實現了簡化的類Windows98風格的圖形用戶界面。圖形用戶界面在許多情況下都優于字符界面,其最大的優點是使應用程序的操作簡單易學。MiniGUI編程基礎在MiniGUI
中,圖形用戶界面包括如下基本元素MiniGUI編程基礎MiniGUI
中的窗口基本分四類,分別為主窗口對話框控件主窗口中的窗片MiniGUI編程基礎MiniGUI
中的主窗口和Windows應用程序的主窗口概念類似,但略微有些不同,MiniGUI
中的每個主窗口對應于一個單獨的線程,通過函數調用可建立主窗口以及對應的線程。每個線程有一個消息隊列,主窗口從這一消息隊列中獲取消息并由窗口過程(回調函數)進行處理。MiniGUI
中的對話框是一種特殊的窗口,對話框一般和控件一起使用,這兩個概念和Windows相關概念是類似的窗片是MiniGUI
所特有的,窗片實際是主窗口的子窗口,只存在于主窗口中。為了處理上的方便,主窗口的子窗口只以平鋪的形式出現,因此我們將這種子窗口稱為“窗片”或“窗格”。窗片可以是私有的控件類型,也可以是標準的控件類型。MiniGUI編程基礎在Windows系列操作系統中,廣泛使用了消息驅動的概念。在MiniGUI中,我們也使用了消息驅動作為應用程序的創建構架MiniGUI中如下定義消息:typedef
struct
{
HWNDhwnd;
intmessage;
WPARAMwParam;
LPARAMlParam;
...
}MSG;MiniGUI編程基礎應用程序一般要提供一個處理消息的標準函數。在消息循環中,系統可以調用此函數,應用程序在此函數中處理相應消息MiniGUI編程基礎消息分為如下幾種類型:系統消息,為系統內部管理使用。鼠標消息,鼠標的點擊、移動等產生的消息。鍵盤消息,鍵盤的按鍵消息。窗口消息,窗口管理消息。菜單消息,菜單管理消息。命令消息等。MiniGUI編程基礎窗口過程是用來處理窗口消息的函數過程。對于同一類型控件,其窗口過程一般是一樣的。因此,系統一般利用窗口的窗口類名來區分不同的窗口類并調用不同的窗口過程由于幾乎每一個主窗口均和其他窗口有著不同的窗口過程,因此,在MiniGUI
中,窗口類的概念只存在于控件和窗片中。對于主窗口來說,其窗口過程在建立主窗口時指定,而對控件和窗片來說,則在注冊窗口類時指定,而在建立窗片或控件時指定所屬窗口類。MiniGUI編程基礎句柄是MiniGUI
用來標識對象的標識符。句柄和指針概念類似,但它不一定是指針值。利用句柄,MiniGUI
將系統變量從應用項目中分離了出來,因為程序員只能通過句柄訪問對象,因而就沒有利用指針是可能發生的因非法訪問而導致的數據不一致問題在MiniGUI
中,窗口、控件、設備環境、菜單、圖標等均使用句柄訪問MiniGUI編程基礎控件可以理解為主窗口中的子窗口。這些子窗口的行為和主窗口一樣,即能夠接收鍵盤和鼠標等外部輸入,也可以在自己的區域內進行輸出,只是它們的所有活動被限制在主窗口中。MiniGUI
也支持子窗口,并且可以在子窗口中嵌套建立子窗口。我們將MiniGUI
中的所有子窗口均稱為控件。MiniGUI編程基礎MiniGUI
提供了常用的預定義控件類,包括按鈕(包括單選鈕、復選鈕)、靜態框、列表框、進度條、滑塊、編輯框等等。程序也可以定制自己的控件類,注冊后再創建對應的實例。MiniGUI編程基礎MiniGUI
預定義的控件類和對應類名稱如下表所示MiniGUI編程基礎對話框是一類特殊的主窗口,這種主窗口只關注與用戶的交互――向用戶提供輸出信息,但更多的是用于用戶輸入對話框分為模態和非模態對話框。簡單而言,模態對話框就是顯示之后,用戶不能再切換到其他主窗口進行工作的對話框,而只能在關閉之后,才能使用其他的主窗口。MiniGUI編程基礎MiniGUI
中,使用DialogBoxIndirectParam
函數建立的對話框就是模態對話框。該對話框首先根據模板建立對話框,然后禁止其托管主窗口,并在主窗口的MSG_CREATE消息中創建控件,并發送MSG_INITDIALOG消息給回調函數,最終建立一個新的消息循環,并進入該消息循環,直到程序調用EndDialog
函數為止MiniGUI程序框架理解MiniGUI基本編程方法的最快途徑就是分析一個簡單程序的結構。下面我們以一個MiniGUI版本的“HelloWorld!”程序來進行說明。該程序在屏幕上創建一個大小為800×600像素的應用程序窗口,并在窗口客戶區的中部顯示“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應用程序都必須包括的頭義件Common.h:包括MiniGUl常用的宏以及數據類型的定義Minigui.h:包含了全局的和通用的接口函數以及某些雜項函數定義Gdi.h:包含了MiniGUI繪圖函數的接口定義Window.h:包含了窗口有關的宏、數據類犁、數據結構定義以及函數接口聲明#include<stdio.h>#include<minigui/common.h>#include<minigui/minigui.h>#include<minigui/gdi.h>#include<minigui/window.h>MiniGUI程序框架使用預定義控件的MiniGUI應用程序還必須包括另外一個頭義件<minigui/control.h>。control.h包含了libminigui中所有內建控件的接口定義。MiniGUI程序框架一個C程序的入口點為main函數,而一個MiniGUl程序的入口點為MiniGUlMain,該函數原型如下:int
MiniGUIMain(int
argc,constchar*argv[])
main函數已經在MiniGUl的函數庫中定義了,該函數在進行一些MiniGUI的初始化工作之后調用MiniGUlMain函數。所以,每個MiniGUI應用程序(無論是服務器端程序mginit還是客戶端應用程序)的入口點均為MiniGUIMain函數。參數argc和argv與C程序main函數的參數argc和argv含義是一樣的,分別為命令行參數個數和參數字符串數組指針MiniGUI程序框架3.MiniGUI-Processes模式下加入層4.創建和顯示主窗口#ifdef_MGRM_PROCESSES
JoinLayer(NAME_DEF_LAYER,"helloworld",0,0);#endifhMainWnd=CreateMainWindow(&CreateInfo);MiniGUI程序框架每個MiniGUl應用程序的初始界面一般都是一個主窗口,你可以通過調用CreateMainWindow函數來創建一個主窗口,其參數是一個指向MAINWlNCREATE結構的指針,本例中就是CreateInfo,返回值為所創建主窗口的句柄。MAINWlNCREATE結構描述一個上主窗口的屬性,在使用CreateInfo創建主窗口之前,需要設置它的各項屬性。MiniGUI程序框架1.設置主窗口風格,把窗口設為初始可見的,并具有邊框和標題欄。CreateInfo.dwStyle=WS_VISIBLE|WS_BORDER|WS_CAPTION;2.設置窗口的擴展風格,該窗口沒有擴展風格。CreateInfo.dwExStyle=WS_EX_NONE;3.設置主窗口的標題為“HelloWorld”。CreateInfo.spCaption="HelloWorld";4.設置主窗口的主菜單,該窗口沒有主菜單。CreateInfo.hMenu=0;MiniGUI程序框架5.設置主窗口的光標為系統缺省光標。CreateInfo.hCursor=GetSystemCursor(0);6.設置主窗口的圖標,該窗口沒有圖標。CreateInfo.hIcon=0;7.設置豐窗口的窗口過程函數為HelloWinProc,所有發往該窗口的消息由該函數處理。CreateInfo.MainWindowProc=HelloWinProcMiniGUI程序框架8.設置豐窗口在屏幕上的位置,該窗口左上角位于(0,O),右下角位于(240,180)。CreateInfo.lx=0;CreateInfo.ty=0;CreateInfo.rx=240;CreateInfo.by=180;9.設置主窗口的背景色為白色,PIXEL_lighwhite是MiniGUl預定義的象素值。CreateInfo.iBkColor=COLOR_lightwhite;10.設置主窗口的附加數據,該窗口沒有何附加數據。CreateInfo.dwAddData=0;MiniGUI程序框架11.設置主窗口的托管窗口為桌面窗口。CreateInfo.hHosting=HWND_DESKTOP;創建完主窗口之后,還需要調用ShowWindow函數才能把所創建的窗口顯示在屏幕上。SHowWindow的第一個參數為所要顯示的窗口句柄,第二個參數指明顯示窗口的方式(顯示還是隱藏),SW_SHOWNORMAL說明要顯示主窗口,并把它置為頂層窗口。MiniGUI程序框架在調用ShowWindow函數之后,主窗口就會顯示在屏幕上。和其它GUI一樣,現在是進入消息循環的時候了。MiniGUI為每一個MiniGUl程序維護一個消息隊列。在發生事件之后,MiniGUI將事件轉換為一個消息,并將消息放入目標程序的消息隊列之中。應用程序現在的任務就是執行如下的消息循環代碼,不斷地從消息隊列中取出消息,進行處理:while(GetMessage(&Msg,hMainWnd)){
TranslateMessage(&Msg);
DispatchMessage(&Msg);}MiniGUI程序框架GetMessage函數調用從應用程序消息隊列中取出一個消息該函數調用的第二個參數為要獲取消息的主窗口的句柄,第一個參數為一個指向MSG結構的指針,GetMessage(&Msg,hMainWnd)MiniGUI程序框架GetMessage函數將用從消息隊列中取出的消息來填充該消息結構的各個域,包括:hwnd:消息發往的窗口的句柄。在Helloworld.c程序中,該值與hMainWnd相同。message:消息標識符。這是一個用于標識消息的整數值。每一個消息均有一個對應的預定義標識符,這些標識符定義在window.h頭文件中,以前綴MSG開頭。wPararm:一個32位的消息參數,其含義和值根據消息的不同而不同。IParam:一個32位的消息參數,其含義和值取決于消息的類型。time:消息放入消息隊列中的時間。
MiniGUI程序框架窗口過程函數是MiniGUI程序的主體部分,應用程序實際所做的工作大部分都發生在窗口過程函數中,因為GUI程序的主要任務就是接收和處理窗口收到的各種消息。在helloworld.c程序中,窗口過程是名為HelloWinProc的函數。窗口過程函數可以由程序員任意命名CreateMainWindow函數根據MAINWlNCREATE結構類型的參數中指定的窗口過程創建主窗口。窗口過程函數總是定義為如下形式:staticint
HelloWinProc(HWND
hWnd,intmessage,WPARAMwParam,LPARAMlParam)MiniGUI程序框架窗口過程的4個參數與MSG結構的前四個域是相同的。第一個參數hWnd是接收消息的窗口的句柄,它與CreateMainWindow函數的返回值相同,該值標識了接收該消息的特定窗口。第二個參數與MSG結構中的message域相同,它是一個標識窗口所收到消息的整數值。最后兩個參數都是32位的消息參數,它提供和消息相關的特定信息。程序通常不直接調用窗口過程函數,而是由MiniGUI進行調用;也就是說,它是一個回調函數。MiniGUI程序框架程序在響應MSG_PAINT消息時進行屏幕輸出。應用程序應首先通過調用BeginPaint函數來獲得設備上下文句柄,并用它凋用GDI函數來執行繪制操作。這里,程序使用TextOut文本輸出函數在客戶區的中部顯示了一個“HelloIamTeacherWen!”字符串。繪制結束之后,應用程序調用EndPaint函數釋放設備上下文句柄。MiniGUI程序框架用戶單擊窗口右上角的關閉按鈕時窗口過程函數將收到一個MSG_CLOSE消息。程序在收到MSG_CLOSE消息時調用DestroyMainWindow函數銷毀主窗口,并且還調用PostQuitMessage函數在消息隊列中投入一個MSG_QUIT消息。當GetMessage函數取出MSG_QUIT消息時將返回0,最終導致程序退出消息循環。MiniGUI程序框架輸入如下命令來編譯helloworld.c,并鏈接生成可執行文件helloworld:-o選項:告訴gcc要生成的目標文件名,這里是helloworld;-l選項:指定生成helloworId要鏈接的庫,這里鏈接的是minigui_ths庫,當MiniGUI配置為MiniGUI-Threads時,還要鏈接pthread庫。pthread是提供POSIX兼容線程支持的函數庫,編譯MiniGUI-Threads程序時必須連接這個函數庫;其它要鏈接的jpeg、png、z等函數厙,則是MiniGUI內部所依賴的函數庫。gcc-ohelloworld
helloworld.c-lminigui_ths-lpthread-lm-lpng-ljpegMiniGUI程序框架假定你將MiniGUI配置成MiniGUl-Processes,在運行helloworld程序之前。首先要確保已啟動了MiniGUI的服務器端程序mginit。比如你可以啟動MDE的mginit程序,然后進入helloworld文件所在目錄,在命令行上輸入./helloworld啟動helloworld程序。MiniGUI程序框架mStudio
的中文全稱為“飛漫可視化軟件集成開發平臺”,是面向MiniGUI3.0的一款集成開發環境。mStudio
基于Eclipse集成開發環境開發,并為用戶提供了所見即所得的界面設計工具,可自動生成和維護MiniGUI3.0的應用程序框架,進行代碼的編輯、編譯、運行、調試,從而加快MiniGUI3.0應用程序的開發,降低使用MiniGUI
的門檻。除此之外,我們還需要安裝Eclipse、MiniGUI和mGNCS,Eclipse需要3.4或以上版本,而MiniGUI則必須安裝最新的3.0.4版本,這兩個軟件的安裝已經在前面的章節介紹了,下面我們將重點介紹mGNCS和mStudio安裝過程。首
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 有機無機崗位面試題目與參考答案
- 薪酬體系考試題目及答案展示
- 內科護理年終工作總結
- 2025屆云南省保山市龍陵縣數學三年級第二學期期末預測試題含答案
- 2025屆麗江地區玉龍納西族自治縣四年級數學第二學期期末學業質量監測模擬試題(含答案)
- 導游考證試題及答案
- 遴選公文試題及答案
- 珍稀動植物考試試題及參考答案
- 2025-2026學年黑龍江省雞西市虎林市六校聯考四下數學期中調研試題含解析
- 2025-2026學年黑龍江省伊春市伊春區數學三年級下學期期末教學質量檢測試題含答案解析
- 快遞驛站可行性研究報告
- 房屋加固施工協議書
- 2025年寧夏黃河出版傳媒集團有限公司招聘筆試參考題庫含答案解析
- 國家職業技能標準-動物疫病防治員2020年版-20211027001
- 信息技術必修一《數據與計算》第一章第一節《數據、信息與知識》教案
- 一《歸園田居(其一)》公開課一等獎創新教案設計中職語文高教版(2023-2024)基礎模塊下冊
- 雅馬哈RX-V365使用說明書
- T-CRHA 046-2024 標準手術體位安置技術規范
- 草莓收購協議與草莓苗購銷合同
- 《電力工程接地用導電防腐涂料技術條件》
- (高清版)DZT 0295-2016 土地質量生態地球化學評價規范
評論
0/150
提交評論