MINIGUI简介MiniGUI是由北京飞漫软件技术有限公司创办的开源Linux图形用户界面支持系统,经过近些年的发展,MiniGUI已经发展成为比较成熟的性能优良的、功能丰富的跨操作系统的嵌入式图形界面支持系统。“小”是MiniGUI的特色,它目前已经广泛应用于通讯、医疗、工控、电子、机顶盒、多媒体等领域。目前,MiniGUI的最新版本为MiniGUI3.0。1MINIGUI概述2MiniGUI起初仅仅是为了能够在Linux上显示中文而开发的,但是目前,MiniGUI已发展为一个跨操作系统的嵌入式图形支持系统。目前MiniGUI已经一步步发展成为跨操作系统的嵌入式图形中间件产品。MINIGUI介绍3MiniGUI是一个图形用户界面支持系统,通常的GUI编程概念均适用于MiniGUI编程,如窗口和事件驱动编程等。我们可将MiniGUI配置编译成三种架构上截然不同的版本,我们称为运行模式:MiniGUI-ThreadsMiniGUI-LiteMiniGUI-StandaloneMINIGUI的模式4MINIGUI-THREADS运行在MiniGUI-Threads上的程序可以在不同的线程中建立多个窗口,但所有的窗口在一个进程或者地址空间中运行。这种运行模式非常适合于大多数传统意义上的嵌入式操作系统,比如eCos、pSOS、uC/OS-II等等。当然,在Linux和uClinux上,MiniGUI也能以MiniGUI-Threads的模式运行。5MINIGUI版本我们现在使用的为GPL发布的MiniGUIV1.3.3版本。现在我们使用的案例都是基于Threads模式之下。6事件驱动程序的流程不再是只有一个入口和若干个出口的串行执行线路;相反,程序会一直处于一个循环状态,在这个循环当中,程序不断从外部或内部获取某些事件,比如用户的按键或者鼠标的移动,然后根据这些事件作出某种响应,并完成一定的功能,这个循环直到程序接收到某个消息为止。7窗口的概念窗口是屏幕上的一个矩形区域。在传统的窗口系统模型中,应用程序的可视部分由一个或多个窗口构成。每一个窗口代表屏幕上的一块绘制区域,窗口系统控制该绘制区域到实际屏幕的映射,也就是控制窗口的位置、大小以及可见区域89MINIGUI的窗口类型主窗口对话框窗口控件窗口(子窗口)10主窗口的建立每个MiniGUI应用程序的初始界面一般都是一个主窗口,可以通过调用CreateMainWindow函数来创建一个主窗口,其参数是一个指向MAINWINCREATE结构的指针。MSGMsg;HWNDhMainWnd;MAINWINCREATECreateInfo;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;//设置主窗口的图标,该窗口没有图标11主窗口的建立CreateInfo.MainWindowProc=HelloWinProc;//设置主窗口的窗口过程函数CreateInfo.lx=0;//窗口坐标CreateInfo.ty=0;CreateInfo.rx=320;CreateInfo.by=240;CreateInfo.iBkColor=COLOR_lightwhite;//设置主窗口的背景色为白色CreateInfo.dwAddData=0;//设置主窗口的附加数据CreateInfo.hHosting=HWND_DESKTOP;//设置主窗口的托管窗口为桌面窗口hMainWnd=CreateMainWindow(&CreateInfo);//CreateMainWindow函数根据MAINWINCREATE结构类型的参数中指定的窗口过程创建主窗口。12主窗口的建立if(hMainWnd==HWND_INVALID)return-1;ShowWindow(hMainWnd,SW_SHOWNORMAL);//把所创建的窗口显示在屏幕上while(GetMessage(&Msg,hMainWnd)){TranslateMessage(&Msg);//TranslateMessage函数把击键消息转换为MSG_CHAR消息DispatchMessage(&Msg);//DispatchMessage函数最终将把消息发往该消息的目标窗口的窗口过程,让它进行//处理}//应用程序现在的任务就是执行以上的消息循环代码,不断地从消息队列中取出消息//处理MainWindowThreadCleanup(hMainWnd);//程序最后调用MainWindowThreadCleanup清除主窗口所使用的消息队列等系统资源并最终由MiniGUIMain返回return0;13对话框的建立对话框本质上就是主窗口,应用程序一般通过对话框提示用户进行输入操作。typedefstruct{char*class_name;//controlclassDWORDdwStyle;//controlstyleintx,y,w,h;//controlpositionindialogintid;//controlidentifierconstchar*caption;//controlcaptionDWORDdwAddData;//additionaldataDWORDdwExStyle;//controlextendedstyle}CTRLDATA;typedefCTRLDATA*PCTRLDATA;14对话框的建立typedefstruct{DWORDdwStyle;//dialogboxstyleDWORDdwExStyle;//dialogboxextendedstyleintx,y,w,h;//dialogboxpositionconstchar*caption;//dialogboxcaptionHICONhIcon;//dialogboxiconHMENUhMenu;//dialogboxmenuintcontrolnr;//numberofcontrolsPCTRLDATAcontrols;//poitertocontrolarrayDWORDdwAddData;//addtionaldata,mustbezero}DLGTEMPLATE;typedefDLGTEMPLATE*PDLGTEMPLATE;15对话框的建立结构CTRLDATA用来定义控件,DLGTEMPLATE用来定义对话框本身。staticvoidInitDialogBox(HWNDhWnd){/*将对话框模板结构和控件结构数组关联起来*/DlgInitProgress.controls=CtrlInitProgress;DialogBoxIndirectParam(&DlgInitProgress,hWnd,InitDialogBoxProc,0L);}16主窗口与对话框的一些区别这个是用对话框的模板建立主窗口,好处就是简化了主窗口控件的建立步骤,一般主窗口每建立一个控件就得调一次CreatWindow一次,而且在消息处理函数中,(比较乱)如果使用这个办法一次搞定,对话框多用于存在数据输入输出的地方。17控件窗口较为复杂的GUI系统中,都带有预定义的控件集合,它们是人机交互的主要元素。MiniGUI提供了常用的预定义控件类,包括按钮(包单选钮、复选钮)、静态框、列表框、进度条、滑块、编辑框等等。18控件消息的传送控件内部发生某种事件时,会通过通知消息通知其父窗口。其类型一般有:MSG_CHAR,MSG_COMMAND,MSG_CLOSE,MSG_PAINT等。鼠标信息存放于LOWORD(lParam),HIWORD(lParam),19文件的编译gcc–osamesame.c–lpthread–lminigui–ljpeg–lpng-o选项告诉gcc要生成的目标文件名,这里是same,-l选项指定要链接的库,这里链接的是libminigui库或libpthread。编译MiniGUI-Threads程序时必须连接这个函数库;其它要链接的jpeg、png等函数库,则是MiniGUI内部所依赖的函数库。如果要生成要在目标板上运行的程序时,我们要选择交叉编译器为arm-linux-gcc20配置编译环境配置SQLite的交叉编译环境在PC上配置SQLite数据库配置MiniGUI的交叉编译环境在PC上配置MiniGUI的编译环境21系统需求分析22通过对系统的分析来决定采用MiniGUI的具体实现方式。通过PC模拟环境来进行项目的初始开发,通过修改输入引擎来实现在目标板上的键盘和鼠标操作。在正常的项目中,如果为单进程的GUI项目,则建议使用MiniGUI-Threads模式。主要是因为其可以在应用程序的不同的线程中建立多个窗口,但所有的窗口在一个进程或者地址空间中运行。这种运行模式非常适合于大多数传统意义上的嵌入式操作系统,比如我们使用的Linux操作系统。选择所需的MINIGUI模式23系统中窗口的选择在MiniGUI中主要利用各种窗口和控件进行界面的显示。在进行项目的开发时,选择合适的窗口是很有必要的。对于只是用于显示的窗口界面,推荐使用主窗口界面。对于有对话框机数据输入输出的见面建议使用对话框窗口界面。24MINIGUI中的控件介绍在MiniGUI中主要用到的控件有:按钮,编辑框,静态框,列表框,进度条,菜单按钮等。我们自己也可以注册所需功能的控件,可以通过多种控件的组合来获得所需的界面。25控件风格的介绍窗口的通用风格:WS_VISIBLE(窗口可见)WS_CAPTION(窗口有标题)WS_BORDER(窗口有边框)WS_VSCROLL(垂直滚动条)WS_EX_NONE(无扩展风格)26重要的消息类型MSG_CREATE:在窗口成功创建后进行触发,在其中可以进行新窗口的创建。MSG_COMMAND:控件内部发生事件时,通过此消息来进行发送。MSG_CHAR:有按键值,当按键按下时触发此消息。MSG_LBUTTONDOWN:鼠标点击左键时出发此消息。27重要的消息类型28MSG_PAINT:需要重绘窗口时触发此消息。MSG_CLOSE:关闭窗口时出发此消息。MSG_INITDIALOG:该消息是在MiniGUI根据对话框模板建立对话框以及控件之后,发送到对话框回调函数的。MSG_KEYDOWN:有按键按下时触发此消息。MSG_TIMER:当定时器时间到时触发此消息。主要的API接口函数GetDlgItem:根据控件标识符获得控件句柄。GetWindowText:复制编辑框中的文本。SetWindowText:重置编辑框中的文本。SetWindowBkColor:设置窗口背景颜色。SetWindowAdditionalData:保存对话框的附加数据GetWindowAdditionalData:获得对话框的附加数据。SetTimer:创建一个固定时间间隔的定时器29主要的API接口函数KillTimer:删除定时器SetFocus:使指定的空间获得焦点。EndDialog:关闭对话框。SendMessage:向指定的窗口发送消息。SetNotificationCallback:为控件设置一个通知消息回调函数。LoadBitmap:从指定路径加载图片。FillBoxWithBitmap;对加载的图片进行显示。30主要的API接口函数InvalidateRect:使指定大小窗口内容无效并对其进行重绘。CreateLogFont:创建逻辑字体。DrawTe