嵌入式Linux操作系统第4章-1_第1页
嵌入式Linux操作系统第4章-1_第2页
嵌入式Linux操作系统第4章-1_第3页
嵌入式Linux操作系统第4章-1_第4页
嵌入式Linux操作系统第4章-1_第5页
已阅读5页,还剩82页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

嵌入式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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论