嵌入式Linux开发教程12(MiniGUI图形课件.ppt

上传人(卖家):三亚风情 文档编号:2931221 上传时间:2022-06-12 格式:PPT 页数:52 大小:990.50KB
下载 相关 举报
嵌入式Linux开发教程12(MiniGUI图形课件.ppt_第1页
第1页 / 共52页
嵌入式Linux开发教程12(MiniGUI图形课件.ppt_第2页
第2页 / 共52页
嵌入式Linux开发教程12(MiniGUI图形课件.ppt_第3页
第3页 / 共52页
嵌入式Linux开发教程12(MiniGUI图形课件.ppt_第4页
第4页 / 共52页
嵌入式Linux开发教程12(MiniGUI图形课件.ppt_第5页
第5页 / 共52页
点击查看更多>>
资源描述

1、第12章 MiniGUI图形界面设计1-2课程安排课程安排12.1 Minigui概述概述12.2 Minigui的安装和使用的安装和使用12.3 利用利用Eclipse编写编写MiniGUI程序程序12.4 MiniGUI的编程基础的编程基础12.5 消息循环和窗口过程消息循环和窗口过程12.6 对话框和控件编程对话框和控件编程12.7 图形设备接口图形设备接口12.8 实例实例-MiniQQ界面设计界面设计12.9 小结小结1-312.1 MiniGUI概述概述MiniGUI最初是为了满足一个工业控制系统的需求而设计和开发最初是为了满足一个工业控制系统的需求而设计和开发的。这个工业控制系统

2、是清华大学为一台数控机床设计的计算机的。这个工业控制系统是清华大学为一台数控机床设计的计算机数控系统(数控系统(CNC)。在比较了)。在比较了DOS、Windows 98、Windows NT、Linux等系统之后,该项目组决定选择等系统之后,该项目组决定选择RT-Linux作为实时作为实时操作系统,以便满足操作系统,以便满足2ms甚至更高的实时性。但是图形用户界面甚至更高的实时性。但是图形用户界面是一个问题,因为是一个问题,因为X Window不适合于实时控制系统,并且当时不适合于实时控制系统,并且当时X Window系统的本地化也不尽人意。因此,项目组决定自己开系统的本地化也不尽人意。因此

3、,项目组决定自己开发一套图形用户界面支持系统发一套图形用户界面支持系统。1-412.1.1 MiniGUI的特点的特点显然,显然,MiniGUI一开始就针对实时系统而设计,在设计之初就考一开始就针对实时系统而设计,在设计之初就考虑到了小巧、高性能和高效率。因此,虑到了小巧、高性能和高效率。因此,MiniGUI是一个非常适合是一个非常适合于工业控制实时系统以及嵌入式系统的可定制的、小巧的图形用于工业控制实时系统以及嵌入式系统的可定制的、小巧的图形用户界面支持系统户界面支持系统。它的主要特色有它的主要特色有:1-512.1.2 MiniGUI运行模式运行模式和和Linux这样的类这样的类UNIX操

4、作系统相比,一般意义上的嵌入式操作操作系统相比,一般意义上的嵌入式操作系统具有一些特殊性。举例而言,诸如系统具有一些特殊性。举例而言,诸如uClinux、uC/OS-II、eCos、VxWorks等操作系统,通常运行在没有等操作系统,通常运行在没有MMU(内存管理(内存管理单元,用于提供虚拟内存支持)的单元,用于提供虚拟内存支持)的CPU上。这时,往往就没有进上。这时,往往就没有进程的概念,而只有线程或者任务的概念,这样,程的概念,而只有线程或者任务的概念,这样,GUI系统的运行系统的运行环境也就大相径庭。因此,为了适合不同的操作系统环境,可将环境也就大相径庭。因此,为了适合不同的操作系统环境

5、,可将MiniGUI配置成三种运行模式配置成三种运行模式:MiniGUI-Threads。MiniGUI-Processes。MiniGUI-Standalone。1-612.2 MiniGUI的安装和使用的安装和使用现有的资料主要介绍了现有的资料主要介绍了MiniGUI在在RedHat9.0下的安装和配置,下的安装和配置,而对其他而对其他Linux发行版下应用的资料还很少。本章将介绍发行版下应用的资料还很少。本章将介绍MiniGUI在在Ubuntu下的安装和配置方法,以及如何使用下的安装和配置方法,以及如何使用eclipse进行进行MiniGUI的嵌入式开发的嵌入式开发。1-712.2.1

6、安装安装MiniGUI库库MiniGUI v3.0.12的源代码包可以在飞漫公司的网站上下载的源代码包可以在飞漫公司的网站上下载。安。安装步骤如下:装步骤如下:(1)使用)使用tar命令解压命令解压libminigui-3.0.12.tar.gz文件文件。 $tar zxvf libminigui-3.0.12.tar.gz(2)运行配置命令)运行配置命令。 $cd libminigui-3.0.12 $make menuconfig(3)如果没有出现错误,就可以继续执行)如果没有出现错误,就可以继续执行make和和make install命令编译并安装命令编译并安装libminigui库文件

7、库文件。 $make(4)默认情况下,)默认情况下,MiniGUi的函数库将安装在的函数库将安装在/usr/local/lib目录目录中中。1-812.2.2 安装安装MiniGUI的资源的资源MiniGUI资源的安装比较简单,只需解开软件包并以资源的安装比较简单,只需解开软件包并以root身份运身份运行行make install命令,如下所示命令,如下所示:$tar zxvf minigui-res-1.3.tar.gz$cd minigui-res-1.3.3$sudo make install1-912.2.3 配置配置MiniGUIMiniGUI的配置文件位于的配置文件位于“/usr/

8、local/etc/MiniGUI.cfg”,编辑,编辑这个文件需要具有这个文件需要具有root权限。这里主要是通过该文件选择通过权限。这里主要是通过该文件选择通过QVFB或是或是FrameBuffer作为图形引擎,详细的配置说明请参考作为图形引擎,详细的配置说明请参考MiniGUI的配置手册的配置手册。打开该文件后,请注意下列的配置选项打开该文件后,请注意下列的配置选项:1-1012.2.4 编译应用程序例子编译应用程序例子在在mg-samples-3.0.12.tar.gz中提供了很多介绍中提供了很多介绍MiniGUI中各类中各类函数和控件等使用的例子,这些例子都比较简单,适合初学时研函数

9、和控件等使用的例子,这些例子都比较简单,适合初学时研究。编译该应用程序例程库所需的命令如下:究。编译该应用程序例程库所需的命令如下:$tar zxvf mg-samples-3.0.12.tar.gz $cd mg-samples-3.0.12$./configure$make编译完成后,编译好的可执行文件都在编译完成后,编译好的可执行文件都在src子目录下。子目录下。1-1112.2.5 交叉编译交叉编译MiniGUI库库与编译与编译PC上的上的libminigui的过程是大致相同的,只需在的过程是大致相同的,只需在make menu出现的配置界面中略做配置即可。当出现如图出现的配置界面中略

10、做配置即可。当出现如图12-1所示的所示的配置界面后,选择菜单:配置界面后,选择菜单:Development environment options 按按Enter键后进入子菜单,需要配置的项如图键后进入子菜单,需要配置的项如图12-2所示。所示。1-1212.2.6 交叉编译例程交叉编译例程以交叉编译以交叉编译mg-sample-3.0为例,所需的命令如下:为例,所需的命令如下:$tar zxvf mg-samples-3.0.12.tar.gz $cd mg-samples-3.0.12$./configure$export PATH=”/usr/local/arm/3.4.1/bin”:

11、$PATH$make CC=arm-linux-gcc1-1312.2.7 QVFB图形引擎图形引擎QVFB是是Qt提供的一个虚拟提供的一个虚拟FrameBuffer工具。这个程序基于工具。这个程序基于Qt开发(开发(Qt是是Linux窗口管理器窗口管理器KDE使用的底层函数库),运行在使用的底层函数库),运行在X Window上。可以在上。可以在Qt 2或者或者Qt 3源代码的源代码的src/tools目录下找目录下找到这个程序到这个程序。将将qvfb2-2.0.tar.gz下载后解压,在其中的下载后解压,在其中的QVFB目录下可以找到目录下可以找到QVFB的可执行文件,打开一个终端,然后执

12、行命令:的可执行文件,打开一个终端,然后执行命令:$qvfb&1-1412.2.8 FrameBuffer图形引擎图形引擎FrameBuffer是出现在是出现在Linux 2.2.xx内核当中的一种驱动程序接内核当中的一种驱动程序接口。这种接口将显示设备抽象为帧缓冲区。用户可以将它看成是口。这种接口将显示设备抽象为帧缓冲区。用户可以将它看成是显示内存的一个映像,将其映射到进程地址空间之后,就可以直显示内存的一个映像,将其映射到进程地址空间之后,就可以直接进行读写操作,而写操作可以立即反应在屏幕上。使用接进行读写操作,而写操作可以立即反应在屏幕上。使用FrameBuffer需要内核的支持,同时也

13、与具体所使用的显示芯片需要内核的支持,同时也与具体所使用的显示芯片有关,在不同的系统下有不同的配置方法有关,在不同的系统下有不同的配置方法。1-1512.3 利用利用Eclipse编写编写MiniGUI程序程序Eclipse提供了一个使用十分方便的集成开发环境,在前面的章提供了一个使用十分方便的集成开发环境,在前面的章节中,介绍了如何使用节中,介绍了如何使用Eclipse开发一般的开发一般的Linux程序,在本节中程序,在本节中将介绍如何在将介绍如何在Eclipse中开发和调试中开发和调试MiniGUI的程序。在的程序。在Eclipse下开发下开发MiniGUI的程序主要有以下三点优势的程序主

14、要有以下三点优势:便于工程管理便于工程管理。便于查看帮助便于查看帮助。便于编译和调试便于编译和调试。1-1612.3.1 建立建立vacs工程工程vacs是是mde-1.3.0中的一个比较复杂的演示程序,共有中的一个比较复杂的演示程序,共有10个源代个源代码文件,需要先将这些代码导入至码文件,需要先将这些代码导入至Eclipse的工程中,请读者按的工程中,请读者按下列的步骤操作下列的步骤操作:(1)新建新建Project。选择菜单命令。选择菜单命令File | New | C Project,在随,在随后出现的后出现的Project name中输入工程的名字中输入工程的名字vacs,然后单击,

15、然后单击Finish按钮即可按钮即可。(2)导入源代码文件。选择菜单命令导入源代码文件。选择菜单命令File | Import,然后在分类,然后在分类General中选择中选择File System,单击,单击Browse按钮,选择按钮,选择mde-1.3.0中的中的vacs所在的目录,然后单击所在的目录,然后单击OK确认确认。(3)最后单击最后单击Finish按钮,完成导入工作按钮,完成导入工作。1-1712.3.2 配置编译选项配置编译选项因为因为MiniGUI的程序用到了的程序用到了libminigui、libpthread等库文件,等库文件,所以还需要在编译选项中做好相关的配置。选择菜

16、单所以还需要在编译选项中做好相关的配置。选择菜单Project | Properties,将出现,将出现vacs工程的属性配置对话框。在左侧的列表工程的属性配置对话框。在左侧的列表中选择中选择C/C+ Buile | Settings,然后进行如图,然后进行如图12-7所示的配置所示的配置。1-1812.3.3 配置外部工具配置外部工具QVFB尽管可以直接在命令行运行尽管可以直接在命令行运行QVFB,但,但Eclipse其实提供了更好其实提供了更好的选择,即利用的选择,即利用“外部工具外部工具”功能来启动功能来启动QVFB。配置的方法很。配置的方法很简单简单,选择菜单选择菜单Run | Ext

17、ernal Tools | Open External Tools Dialog,便打开了外部工具的配置界面,便打开了外部工具的配置界面。1-1912.3.4 运行运行vacs当完成前面的准备工作后,就可以运行当完成前面的准备工作后,就可以运行vacs了。选择菜单了。选择菜单Run | Run或组合键或组合键Crtl+F11都可以启动该程序。运行的效果如图都可以启动该程序。运行的效果如图12-10所示所示。1-2012.3.5 调试调试vacs回到编辑环境后,选择菜单回到编辑环境后,选择菜单Run | Debug或按下或按下F11键后便可以键后便可以进入调试模式,如图进入调试模式,如图12-1

18、1所示所示。1-2112.4 MiniGUI的编程基础的编程基础为了说明为了说明MiniGUI的程序结构,从一个经典的例子的程序结构,从一个经典的例子“HelloWorld”说起。函数源代码如下所示说起。函数源代码如下所示。1-2212.4.1 头文件头文件Helloworld的开始所包括的四个头文件是所有的开始所包括的四个头文件是所有MiniGUI应用程序应用程序都必须包括的头文件。它们的含义分别如下都必须包括的头文件。它们的含义分别如下:common.h:包括:包括MiniGUI常用的宏及数据类型的定义。常用的宏及数据类型的定义。minigui.h:包含了全局的和通用的接口函数以及某些杂项

19、函数:包含了全局的和通用的接口函数以及某些杂项函数的定义。的定义。window.h:包含了窗口有关的宏、数据类型、数据结构的定义:包含了窗口有关的宏、数据类型、数据结构的定义以及函数接口声明。以及函数接口声明。control.h:包含了:包含了libminigui中所有内建控件的接口定义中所有内建控件的接口定义。1-2312.4.2 程序入口程序入口一个一个C程序的入口点为程序的入口点为main()函数,而一个函数,而一个MiniGUI程序的入口程序的入口点为点为MiniGUIMain()。该函数的原型如下:。该函数的原型如下:int MiniGUIMain (int argc, const

20、char* argv)main()函数已经在函数已经在MiniGUI的函数库中定义了,该函数在进行一的函数库中定义了,该函数在进行一些些MiniGUI的初始化工作之后调用的初始化工作之后调用MiniGUIMain()函数。所以,函数。所以,每个每个MiniGUI应用程序应用程序(无论是服务器端程序无论是服务器端程序mginit还是客户端应还是客户端应用程序用程序)的入口点均为的入口点均为MiniGUIMain()函数。参数函数。参数argc和和argv与与C程序程序main函数的参数函数的参数argc和和argv的含义是一样的,分别为命令的含义是一样的,分别为命令行参数的个数和参数字符串的数组

21、指针。行参数的个数和参数字符串的数组指针。1-2412.4.3 创建和显示主窗口创建和显示主窗口每个每个MiniGUI应用程序的初始界面一般都是一个主窗口,可以通应用程序的初始界面一般都是一个主窗口,可以通过调用过调用CreateMainWindow()函数来创建一个主窗口,其参数是函数来创建一个主窗口,其参数是一个指向一个指向MAINWINCREATE结构的指针,本例中就是结构的指针,本例中就是CreateInfo,返回值为所创建的主窗口的句柄。,返回值为所创建的主窗口的句柄。MAINWINCREATE结构描述一个主窗口的属性结构描述一个主窗口的属性。创建完主窗口之后,还需要调用创建完主窗口

22、之后,还需要调用ShowWindow()函数才能把所创函数才能把所创建的窗口显示在屏幕上。建的窗口显示在屏幕上。ShowWindow()的第一个参数为所要显的第一个参数为所要显示的窗口句柄,第二个参数指明显示窗口的方式示的窗口句柄,第二个参数指明显示窗口的方式(显示还是隐藏显示还是隐藏),SW_SHOWNORMAL说明要显示主窗口,并把它置为顶层窗口说明要显示主窗口,并把它置为顶层窗口。1-2512.4.4 进入消息循环进入消息循环在调用在调用ShowWindow()函数之后,主窗口就会显示在屏幕上。和函数之后,主窗口就会显示在屏幕上。和其他其他GUI一样,现在是进入消息循环的时候了。一样,现

23、在是进入消息循环的时候了。MiniGUI为每一为每一个个MiniGUI程序维护一个消息队列。在发生事件之后,程序维护一个消息队列。在发生事件之后,MiniGUI将事件转换为一个消息,并将消息放入目标程序的消息队列之中。将事件转换为一个消息,并将消息放入目标程序的消息队列之中。应用程序现在的任务就是执行如下的消息循环代码,不断地从消应用程序现在的任务就是执行如下的消息循环代码,不断地从消息队列中取出消息,进行处理息队列中取出消息,进行处理。1-2612.4.5 窗口过程函数窗口过程函数窗口过程函数是窗口过程函数是MiniGUI程序的主体部分,应用程序实际所作的程序的主体部分,应用程序实际所作的工

24、作大部分都发生在窗口过程函数中,因为工作大部分都发生在窗口过程函数中,因为GUI程序的主要任务程序的主要任务就是接受和处理窗口收到的各种消息就是接受和处理窗口收到的各种消息。在在Helloworld程序中,窗口过程是名为程序中,窗口过程是名为HelloWinProc()的函数。的函数。窗口过程函数可以由程序员任意命名,窗口过程函数可以由程序员任意命名,CreateMainWindow()函函数根据数根据MAINWINCREATE结构类型的参数中指定的窗口过程创结构类型的参数中指定的窗口过程创建主窗口。窗口过程函数总是定义为如下形式建主窗口。窗口过程函数总是定义为如下形式:static int

25、HelloWinProc(HWND hWnd, int message, WPARAM wParam, LPARAM lParam);1-2712.4.6 屏幕输出屏幕输出程序在响应程序在响应MSG_PAINT消息时进行屏幕输出。应用程序应首先消息时进行屏幕输出。应用程序应首先通过调用通过调用BeginPaint()函数来获得设备上下文句柄,并用它调用函数来获得设备上下文句柄,并用它调用GDI函数来执行绘制操作。这里,程序使用函数来执行绘制操作。这里,程序使用TextOut()文本输出函文本输出函数在客户区的中部显示了一个数在客户区的中部显示了一个“Hello world!”字符串。绘制结字符

26、串。绘制结束之后,应用程序应调用束之后,应用程序应调用EndPaint()函数释放设备上下文句柄函数释放设备上下文句柄。1-2812.4.7 程序的退出程序的退出用户单击窗口右上角的关闭按钮时窗口过程函数将收到一个用户单击窗口右上角的关闭按钮时窗口过程函数将收到一个MSG_CLOSE消息。消息。Helloworld程序在收到程序在收到MSG_CLOSE消息消息时调用时调用DestroyMainWindow()函数销毁主窗口,并调用函数销毁主窗口,并调用PostQuitMessage()函数在消息队列中投入一个函数在消息队列中投入一个MSG_QUIT消消息。当息。当GetMessage()函数取

27、出函数取出MSG_QUIT消息时将返回消息时将返回0,最,最终导致程序退出消息循环。终导致程序退出消息循环。程序最后调用程序最后调用MainWindowThreadCleanup()清除主窗口所使用清除主窗口所使用的消息队列等系统资源并由的消息队列等系统资源并由MiniGUIMain()返回。运行结果如图返回。运行结果如图12-12所示所示。1-2912.5 消息循环和窗口过程消息循环和窗口过程我们知道,流行的我们知道,流行的GUI编程都有一个重要的概念与之相关,即编程都有一个重要的概念与之相关,即“事件驱动编程事件驱动编程”。事件驱动的含义就是,程序的流程不再是只。事件驱动的含义就是,程序的

28、流程不再是只有一个入口和若干个出口的串行执行线路;相反,程序会一直处有一个入口和若干个出口的串行执行线路;相反,程序会一直处于一个循环状态,在这个循环当中,程序从外部输入设备获取某于一个循环状态,在这个循环当中,程序从外部输入设备获取某些事件,比如用户的按键或者鼠标的移动,然后根据这些事件作些事件,比如用户的按键或者鼠标的移动,然后根据这些事件作出某种的响应,并完成一定的功能,这个循环直到程序接收到某出某种的响应,并完成一定的功能,这个循环直到程序接收到某个消息为止。个消息为止。“事件驱动事件驱动”的底层设施,就是常说的的底层设施,就是常说的“消息队列消息队列”和和“消息循环消息循环”。1-3

29、012.5.1 消息处理函数消息处理函数简而言之,消息循环就是一个循环体,在这个循环体中,程序利简而言之,消息循环就是一个循环体,在这个循环体中,程序利用用GetMessage函数不停地从消息队列中获得消息,然后利用函数不停地从消息队列中获得消息,然后利用DispatchMessage函数将消息发送到指定的窗口,也就是调用函数将消息发送到指定的窗口,也就是调用指定窗口的窗口过程,并传递消息及其参数。典型的消息循环如指定窗口的窗口过程,并传递消息及其参数。典型的消息循环如下所示下所示。GetMessage()函数从函数从hMainWnd窗口所属的消息队列当中获得窗口所属的消息队列当中获得消息,然

30、后调用消息,然后调用TranslateMessage()函数将函数将MSG_KEYDOWN和和MSG_KEYUP消息翻译成消息翻译成MSG_CHAR消息,最后调用消息,最后调用DispatchMessage()函数将消息发送到指定的窗口函数将消息发送到指定的窗口。1-3112.5.2 重要的消息重要的消息在窗口(包括主窗口和子窗口在内)的生存周期当中,有几个重在窗口(包括主窗口和子窗口在内)的生存周期当中,有几个重要的消息需要仔细处理。如表要的消息需要仔细处理。如表12-3所示,总结了这些消息的概念所示,总结了这些消息的概念和典型处理和典型处理。1-3212.5.3 窗口及窗口过程窗口及窗口过

31、程窗口是窗口是MiniGUI当中最基本的当中最基本的GUI元素,一旦窗口建立之后,窗元素,一旦窗口建立之后,窗口就会从消息队列当中获取属于自己的消息,然后交由它的窗口口就会从消息队列当中获取属于自己的消息,然后交由它的窗口过程进行处理。这些消息当中,有一些是基本的输入设备事件,过程进行处理。这些消息当中,有一些是基本的输入设备事件,而有一些则是与窗口管理相关的逻辑消息而有一些则是与窗口管理相关的逻辑消息。1-3312.6 对话框和控件编程对话框和控件编程对话框编程是一个快速构建用户界面的技术。通常,在编写简单对话框编程是一个快速构建用户界面的技术。通常,在编写简单的图形用户界面时,可以通过调用

32、的图形用户界面时,可以通过调用CreateWindow()函数直接创函数直接创建所有需要的子窗口,即控件。但在图形用户界面比较复杂的情建所有需要的子窗口,即控件。但在图形用户界面比较复杂的情况下,每建立一个控件就调用一次况下,每建立一个控件就调用一次CreateWindow()函数,并传函数,并传递许多复杂参数的方法很不可取。主要原因之一,就是程序代码递许多复杂参数的方法很不可取。主要原因之一,就是程序代码和用来建立控件的数据混在一起,不利于维护。为此,一般的和用来建立控件的数据混在一起,不利于维护。为此,一般的GUI系统都会提供一种机制,利用这种机制,通过指定一个模板,系统都会提供一种机制,

33、利用这种机制,通过指定一个模板,GUI系统就可以根据此模板建立相应的主窗口和控件。系统就可以根据此模板建立相应的主窗口和控件。MiniGUI也提供这种方法,通过建立对话框模板,就可以建立模态或者非也提供这种方法,通过建立对话框模板,就可以建立模态或者非模态的对话框模态的对话框。1-3412.6.1 控件的概念控件的概念控件可以理解为主窗口中的子窗口。这些子窗口的行为和主窗口控件可以理解为主窗口中的子窗口。这些子窗口的行为和主窗口一样,即能够接收键盘和鼠标等外部输入,也可以在自己的区域一样,即能够接收键盘和鼠标等外部输入,也可以在自己的区域内进行输出,只是它们的所有活动被限制在主窗口中。内进行输

34、出,只是它们的所有活动被限制在主窗口中。MiniGUI也支持子窗口,并且可以在子窗口中嵌套建立子窗口,将也支持子窗口,并且可以在子窗口中嵌套建立子窗口,将MiniGUI中的所有子窗口均称为控件中的所有子窗口均称为控件。1-3512.6.2 预定义控件预定义控件MiniGUI提供了常用的预定义控件类,包括按钮(单选钮、复选提供了常用的预定义控件类,包括按钮(单选钮、复选钮)、静态框、列表框、进度条、滑块、编辑框,等等。程序也钮)、静态框、列表框、进度条、滑块、编辑框,等等。程序也可以定制自己的控件类,注册后再创建对应的实例。如表可以定制自己的控件类,注册后再创建对应的实例。如表12-5所所示,给

35、出了示,给出了MiniGUI预先定义的控件类和相应的类名称定义预先定义的控件类和相应的类名称定义。1-3612.6.3 自定义控件自定义控件用户也可以通过用户也可以通过RegisterWindowClass()函数注册自己的控件类,函数注册自己的控件类,并建立该控件类的控件实例。如果程序不再使用某个自定义的控并建立该控件类的控件实例。如果程序不再使用某个自定义的控件类,则应该使用件类,则应该使用UnregisterWindowClass()函数注销自定义的函数注销自定义的控件类。上述两个函数以及和窗口类相关函数的原型如下控件类。上述两个函数以及和窗口类相关函数的原型如下(include/win

36、dow.h):BOOL GUIAPI RegisterWindowClass (PWNDCLASS pWndClass);BOOL GUIAPI UnregisterWindowClass (const char* szClassName);1-3712.6.4 控件子类化控件子类化采用控件类和控件实例的结构,不仅可以提高代码的可重用性,采用控件类和控件实例的结构,不仅可以提高代码的可重用性,而且还可以方便地对已有控件类进行扩展。比如,在需要建立一而且还可以方便地对已有控件类进行扩展。比如,在需要建立一个只允许输入数字的编辑框时,就可以通过重载已有编辑框控件个只允许输入数字的编辑框时,就可以通

37、过重载已有编辑框控件类而实现,而不需要重新编写一个新的控件类。在类而实现,而不需要重新编写一个新的控件类。在MiniGUI中,中,这种技术称为子类化或者窗口派生。子类化的方法有以下三种这种技术称为子类化或者窗口派生。子类化的方法有以下三种:(1)对已经建立的控件实例进行子类化,子类化的结果是只影对已经建立的控件实例进行子类化,子类化的结果是只影响这一个控件实例响这一个控件实例。(2)对某个控件类进行子类化,将影响其后创建的所有该控件对某个控件类进行子类化,将影响其后创建的所有该控件类的控件实例类的控件实例。(3)在某个控件类的基础上新注册一个子类化的控件类,不会在某个控件类的基础上新注册一个子

38、类化的控件类,不会影响原有控件类。在影响原有控件类。在Windows中,这种技术又称为超类化中,这种技术又称为超类化。1-3812.6.5 对话框和对话框模板对话框和对话框模板在在MiniGUI中,对话框是一类特殊的主窗口,这种主窗口只关注中,对话框是一类特殊的主窗口,这种主窗口只关注与用户的交互与用户的交互向用户提供输出信息,但更多的是用于用户输向用户提供输出信息,但更多的是用于用户输入。对话框可以理解为子类化之后的主窗口类。它针对对话框的入。对话框可以理解为子类化之后的主窗口类。它针对对话框的特殊性(即用户交互)进行了特殊设计。比如用户可以使用特殊性(即用户交互)进行了特殊设计。比如用户可

39、以使用TAB键遍历控件、可以利用键遍历控件、可以利用ENTER键表示默认输入等。在键表示默认输入等。在MiniGUI当当中,在建立对话框之前,首先需要定义一个对话框模板,该模板中,在建立对话框之前,首先需要定义一个对话框模板,该模板中定义了对话框本身的一些属性,比如位置和大小等,同时定义中定义了对话框本身的一些属性,比如位置和大小等,同时定义了对话框中所有控件的初始信息,包括位置、大小、风格等了对话框中所有控件的初始信息,包括位置、大小、风格等。在在MiniGUI中,用两个结构来表示对话框模板(中,用两个结构来表示对话框模板(src/window.h)。)。结构结构CTRLDATA和和DLGT

40、EMPLATE的定义如下所示的定义如下所示。1-3912.6.6 模态和非模态对话框模态和非模态对话框模态对话框就是显示之后,用户不能再切换到其他主窗口进行工模态对话框就是显示之后,用户不能再切换到其他主窗口进行工作的对话框,而只能在关闭之后,才能使用其他的主窗口。作的对话框,而只能在关闭之后,才能使用其他的主窗口。MiniGUI中,使用中,使用DialogBoxIndirectParam()函数建立的对话框函数建立的对话框就是模态对话框就是模态对话框。非模态的对话框实际上就是利用对话框模板建立的普通的主窗口。非模态的对话框实际上就是利用对话框模板建立的普通的主窗口。可以通过可以通过Creat

41、eMainWindowIndirect()函数来建立一个非模态函数来建立一个非模态的对话框。该函数以及相关函数的原型如下的对话框。该函数以及相关函数的原型如下:销毁非模态窗口的函数为销毁非模态窗口的函数为:1-4012.7 图形设备接口图形设备接口GUI系统的一个重要组成部分就是系统的一个重要组成部分就是GDI,即图形设备接口,即图形设备接口(Graphics Device Interface,GDI)。通过)。通过GDI,GUI程序就程序就可以在计算机屏幕上,或者其他的显示设备上进行图形输出,包可以在计算机屏幕上,或者其他的显示设备上进行图形输出,包括基本绘图和文本输出括基本绘图和文本输出。

42、1-4112.7.1 图形设备上下文图形设备上下文图形设备定义了计算机显示屏幕上的一个矩形输出区域。在调用图形设备定义了计算机显示屏幕上的一个矩形输出区域。在调用图形输出函数时,均要求指定经初始化的图形设备上下文图形输出函数时,均要求指定经初始化的图形设备上下文(Device Context,DC),也称作),也称作“设备环境设备环境”。从程序员的角。从程序员的角度看,一个经过初始化的图形设备上下文确定了其后进行图形输度看,一个经过初始化的图形设备上下文确定了其后进行图形输出的一些基本属性,并一直保持这些属性,直到被改变为止。这出的一些基本属性,并一直保持这些属性,直到被改变为止。这些属性包括

43、:输出的线条颜色、填充颜色、字体颜色、字体形状些属性包括:输出的线条颜色、填充颜色、字体颜色、字体形状等。而从等。而从GUI系统角度来讲,一个图形设备上下文所代表的含义系统角度来讲,一个图形设备上下文所代表的含义就要复杂得多,它起码应该包含如下内容就要复杂得多,它起码应该包含如下内容:该设备上下文本所在设备信息(显示模式、色彩深度、显存布局该设备上下文本所在设备信息(显示模式、色彩深度、显存布局等)。等)。该设备上下文所代表的窗口以及该窗口被其他窗口剪切的信息。该设备上下文所代表的窗口以及该窗口被其他窗口剪切的信息。该设备上下文的基本操作函数(点、直线、多边形、填充、块操该设备上下文的基本操作

44、函数(点、直线、多边形、填充、块操作等),及其上下文信息。作等),及其上下文信息。由程序设定的局部信息(绘图属性、映射关系和局部剪切域等)由程序设定的局部信息(绘图属性、映射关系和局部剪切域等)。 1-4212.7.2 矩形操作和区域操作矩形操作和区域操作在在MiniGUI中,矩形是以数据结构中,矩形是以数据结构RECT定义的,其具体结构如定义的,其具体结构如下所示下所示。在在MiniGUI中,区域定义为互不相交矩形的集合。区域可以用来中,区域定义为互不相交矩形的集合。区域可以用来表示窗口的剪切域、无效区域、可见区域等。在表示窗口的剪切域、无效区域、可见区域等。在MiniGUI中,区中,区域和

45、剪切域的定义是一样的,剪切域定义如下域和剪切域的定义是一样的,剪切域定义如下:1-4312.7.3 像素值和调色板像素值和调色板这里有两个基本的概念需要明确区分,即这里有两个基本的概念需要明确区分,即RGB值和像素值值和像素值。RGB:是计算机中通过三原色的不同比例表示某种颜色的方法。:是计算机中通过三原色的不同比例表示某种颜色的方法。像素值:是在显示内存当中保存的像素实际能显示的颜色值像素值:是在显示内存当中保存的像素实际能显示的颜色值。在在MiniGUI中,设置某个像素点的颜色,既可以直接使用像素值中,设置某个像素点的颜色,既可以直接使用像素值(使用(使用SetPixel()函数),也可以

46、间接通过函数),也可以间接通过RGB值来设置(使用值来设置(使用SetPixelRGB()函数)。通过函数)。通过RGB2Pixel函数,可以将函数,可以将RGB值转值转换为像素值换为像素值。调色板是低颜色位数的模式下(比如调色板是低颜色位数的模式下(比如256色或者更少的颜色模式色或者更少的颜色模式),用来建立有限的像素值和),用来建立有限的像素值和RGB对应关系的一个线性表,以对应关系的一个线性表,以较少的存储空间换取较多的显示内容。较少的存储空间换取较多的显示内容。在在MiniGUI当中,可以通过当中,可以通过SetPalette()和和GetPalette()函数进行函数进行调色板的操

47、作,而调色板的操作,而SetColorfulePalette()将调色板设置为默认的将调色板设置为默认的调色板调色板。1-4412.7.4 位图操作函数位图操作函数在在MiniGUI中,存在两种位图,设备相关的位图对象和设备无关中,存在两种位图,设备相关的位图对象和设备无关的位图对象,分别用的位图对象,分别用BITMAP和和MYBITMAP两种数据结构表示。两种数据结构表示。设备相关的位图指的是,位图当中包含的是与指定设备上下文的设备相关的位图指的是,位图当中包含的是与指定设备上下文的显示模式相匹配的像素值,而设备无关图像中则不包括这部分内显示模式相匹配的像素值,而设备无关图像中则不包括这部分

48、内容。容。MiniGUI目前可以用来装载目前可以用来装载BMP文件、文件、JPG文件、文件、GIF文件文件以及以及PCX、TGA等格式的位图文件。等格式的位图文件。MiniGUI的主要位图操作函的主要位图操作函数如表数如表12-9所示所示。1-4512.7.5 字体和文本输出字体和文本输出MiniGUI的逻辑字体功能强大,它包括了字符集、字体类型、风的逻辑字体功能强大,它包括了字符集、字体类型、风格、样式等丰富的信息,不仅仅可以用来输出文本,而且可以用格、样式等丰富的信息,不仅仅可以用来输出文本,而且可以用来分析多语种文本的结构。这在许多文本排版应用中非常有用来分析多语种文本的结构。这在许多文

49、本排版应用中非常有用。如表如表12-10所示为与字体操作相关的函数所示为与字体操作相关的函数。1-4612.7.6 绘制图形绘制图形下面的代码示范了下面的代码示范了Circle()和和Ellipse()函数的用法。假设给定了函数的用法。假设给定了两个点两个点pts0和和pts1,其中,其中pts0是圆心或者椭圆心,而是圆心或者椭圆心,而pts1是圆或者椭圆外切矩形的一个顶点是圆或者椭圆外切矩形的一个顶点。1-4712.8 实例实例-MiniQQ界面设计界面设计MiniQQ是一个仿是一个仿QQ界面的界面的MiniGUI例程,该程序由登录窗口例程,该程序由登录窗口(如图(如图12-14所示)、好友

50、列表窗口(如图所示)、好友列表窗口(如图12-15所示)、关于对所示)、关于对话框(如图话框(如图12-16所示)和聊天窗口(如图所示)和聊天窗口(如图12-17所示)组成。这所示)组成。这是程序运行后见到的第一个界面,用户在这个窗口中输入用户名是程序运行后见到的第一个界面,用户在这个窗口中输入用户名等个人信息,然后选择登录方式,最后单击等个人信息,然后选择登录方式,最后单击“登录登录”按钮进入按钮进入“好好友列表友列表”窗口窗口。1-4812.8.1 登录窗口登录窗口登录窗口用于输入各种用户数据,待用户提交后由程序进行身份登录窗口用于输入各种用户数据,待用户提交后由程序进行身份判别。其实现的

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 办公、行业 > 各类PPT课件(模板)
版权提示 | 免责声明

1,本文(嵌入式Linux开发教程12(MiniGUI图形课件.ppt)为本站会员(三亚风情)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!


侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|