李瑞斋��周健
摘要摘要:介绍了VxWorks系统及WindML,说明了基于WindML的窗口设计原理,重点阐述了窗口用户图形界面设计方法,讨论了一些主要窗口部件设计原理及思路,给出了一些具体代码示例。
关键词关键词:VxWorks;图形界面;窗口部件
DOIDOI:10.11907/rjdk.143925
中图分类号:TP316.7
文献标识码:A文章编号文章编号:16727800(2015)002004203
基金项目基金项目:2014年度河南省重点科技攻关项目(142102210499)
作者简介作者简介:吴秀才(1980-),女,河北衡水人,河南理工大学万方科技学院公共基础课教学部讲师,研究方向为应用数学;李瑞斋(1980-),女,河南南乐人,硕士,郑州大学西亚斯国际学院数理学院讲师,研究方向为概率统计;周健(1964-),男,硕士,河南郑州人,郑州大学西亚斯国际学院数理学院讲师,研究方向为物理教学。
1VxWorks概述
VxWorks系统是美国Wind River公司于1983年设计开发的一种嵌入式实时操作系统,它以卓越的可靠性和实时性被广泛应用于通信、军事、航空、航天等高技术领域 [1]。其内核具有很强的可裁剪性, VxWorks提供了WindML组件用来开发资源消耗较小的图形界面,提高了系统的易用性,满足了对系统界面有要求的用户需求。
本文以Works5.5及其开发环境tomado2.2和组件WindML3.0为基础介绍了窗口化图形界面的设计。
2WindML概述
风河多媒体库[2]WindML(Wind River MUlti-media Library)支持在嵌入式系统上运行多媒体应用程序,提供基本的图形、视频、音频技术及标准设备驱动程序框架,其APl库提供了图形硬件接口和处理输入输出设备事件的能力。
WindML提供了软件开发包(SDK)和驱动程序开发包(DDK)两个组件。SDK用于开发应用程序,提供了用于图形、输入处理、多媒体、字体、内存管理的API库。DDK用于实现驱动程序,可扩展和自定义。
3窗口化图形界面程序设计原理
3.1基本概念
WindML图形设计中的一些基本概念类似于常见的Windows系统下的Visual C++编程,如窗口实例、窗口类等,也有其特有的,如窗口管理器。一个窗口实例即一个可见的矩形窗口对象(包括带框架的普通窗口、无框架窗、窗口部件等)。通过设定其对应属性,可以实现移动、调整大小、重叠、包含于另外窗口的操作,通过编写回调函数,可以响应各种消息,与输入设备、其它窗口、应用程序进行互动。
窗口类定义了具有同样属性的某一类窗口,用于定义窗口部件,通过预先定义,这些窗口部件具有了特殊属性、能力或默认数据。窗口类的源文件在编写过程中,需要编写消息处理器。消息处理器类似消息回调函数,用来响应消息,作出相应反应。消息处理器与回调函数不同之处在于前者关联于窗口类,后者直接关联于某一个窗口实例,并且在编写回调函数时,将其返回值设定为UGL_STATUS_ FINISHED, 可以无视类的消息处理器,使消息不再进一步处理。
窗口管理器由多个源文件组成,包括窗口类文件、资
源预定义文件等,预定义了一些必要的资源和一些基本窗口类。窗口管理器类似设备驱动程序,为窗口应用程序的设计提供了方便的接口。合理利用窗口管理器可以在程序开发过程中提高效率,节省精力。WindML3.0提供了一个基本的窗口管理器WWM(WindML Windows Manager),封装了16种颜色、光标图形、3种字体,以及根窗口、框架类、按钮类、任务栏按钮、任务栏菜单等资源,可以直接使用。设计者可以灵活地自定义窗口管理器,以实现功能扩展。原则上WWM文件禁止更改,因为任何之后的WindML重装、升级、补丁安装等都可能覆盖原来的文件[3],所作的修改也会丢失。因此最好的方法是新建一个窗口管理器。最简易的方法是以原WWM的副本为基础进行创建,大致过程为:在installDir/target/h/ugl/winMgr和installDir/target/src/ugl/winMgr下分别新建自定义的管理器目录,复制原wwm目录下的源文件到新目录,再修改WindML数据库配置文件即可,之后可任意修改窗口管理器文件夹内的源文件,添加新窗口类文件。
3.2窗口创建步骤
WindML的2D图形库提供了基本的绘图操作和字体、位图、光标、颜色、区域等管理器,窗口库以2D图形库为基础,封装了用于窗口操作的API,利用它们创建基本的矩形窗口,不足之处是窗口过于简单,而且没有常用功能的窗口部件,需要自行扩展才能设计出高效、复杂的图形界面。
窗口库封装了大部分必要的初始化操作,利用窗口管理器设计窗口应用程序更简易。创建一个普通窗口的步骤为:①调用winAppCreate()创建窗口应用程序;②调用winCreate()创建服务于该应用程序的窗口; ③调用winCbAdd()为窗口加入回调函数,用来处理交互消息;④调用winAttach()绑定目标窗口到父窗口;⑤调用winAppDestroy()结束窗口应用程序,销毁资源。
4设计方法
4.1基本窗口创建
4.1.1框架窗口与无框架窗口
在winCreate()参数中设置WIN_ ATTRIB_RRAMED属性即可创建框架窗口。框架窗口由两部分组成:窗口类预定义的外框和中间的内容窗。默认的框架类在窗口周围绘制了一个边界,可以通过修改窗口管理器框架类源文件,自定义框架颜色、边界宽度等。可以用鼠标拖拽移动和调整框架大小,且有最大化、最小化、关闭按钮,也可以设置相应属性来禁止这些按钮。窗口库提供有若干框架操作的API,可以设置或获取框架、矩形位置等。
winCreate()参数中不设置框架属性,因此创建出的窗口仅有一个内容窗而没有框架。
4.1.2窗口基本绘图
窗口绘图原理与普通的2D图形绘制一样,使用基本的2D图形库API,但某些步骤,如图形环境变量的创建和配置等被封装在窗口库中,使用起来更方便。窗口绘图方法有两种:异步绘图和同步绘图。
异步绘图是较常用的绘图方法,通过响应绘图消息MSG_DRAW,在回调函数中编写绘图代码,能够动态地绘制窗口内容,在窗口移动后或因遮盖物移走而重新暴露后自动更新、重绘窗口。
同步绘图是静态的,通过调用winDrawStart()和winDrawEnd()在任何时候都可以进行绘图操作,其间利用基本绘图函数编写具体的绘图代码。这种绘图方法是一次性的,不能自动重绘,因此不太常用。
4.2窗口部件
一个窗口化图形界面需要众多窗口部件来实现各种功能,但WindML的窗口库仅提供了一个基本窗口创建函数winCreate(),对于复杂界面来说是远远不够的,因此需要花费一定的工作量自定义窗口部件。默认的窗口管理器提供了几个基本的窗口部件类,包括按钮、任务栏、菜单,可以此为基础进行扩展。
4.2.1按钮
按钮在图形界面开发中是最常见的,WWM默认的按钮类中提供了一些很有用的函数:按钮创建、文本设置、字体设置及获取、按钮颜色设置。
按钮类消息处理器处理的一些主要消息有:
MSG_DRAW:绘制有立体感的按钮外观,包括边界色和背景色;
MSG_BUTTON DRAW:绘制按钮文本;
MSG_MANAGE:分配资源(设置默认字体和颜色);
MSG_UNMANAGE:销毁资源;
MSG_PTR_BTNl_DOWN:重新绘图,模拟鼠标左键按下时按钮下沉的外观;
MSG_PTR_BTNI_UP:重新绘图,模拟鼠标左键弹起时按钮弹起的外观。
在按钮MSG_BUTTON_DRAW的消息处理器中,绘图代码的原型是直接以单字节文本绘制,可以修改为先判断按钮字符串是英文还是中文,再根据判断结果进行绘制,大致流程如图1。
图1按钮绘制函数流程
4.2.2文本框
文本输入框也是窗口界面设计中常用的窗体,是用户进行数据输入的典型窗口部件。默认窗口管理器并没有提供文本框类,设计者可以按照按钮类自行设计。
4.2.3其它部件
默认的菜单类和任务类能够在任务栏菜单中添加菜单项或添加任务栏按钮,可以改进和扩展源文件以满足实际开发的需要。其它没有提供的窗口部件类可像前文介绍的文本框类一样,自行在窗口管理器中设计添加。
4.3代码示例
下面以一个简单的系统登录界面为例,给出部分代码:
/*创建窗口应用程序*/
appId=winAppCreate("winsysLogin”,0, 0, 0, UGL_ NULL);
……
/*创建主窗口,居中置顶*/
winLoginld=winGreate(appId,UGL_NULL, WIN_ATTRIB_VISIBLE|WIN_ATTRIB_TOPMOST,
(displayWidth-300)/2,(displayHeight-200)/2,
300, 200, UGL_NULL, 0, UGL_NULL);
winCbAdd (winLoginId, MSG_DRAW, 0, (WIN_CB*)cbWinLoginDraw,UGL_NULL);
winCbAdd(winLoginId,MSG_MANAGE,O,(WIN_CB*)cbWinLoginManage,UGL_NULL);
winCbAdd(winLoginId,MSG_UNMANAGE,O,(WIN_CB*)cbWinLoginUnmanage,UGL_NULL);
winAttach(winLoginId,UGLNULL_ID,UGL_NULL_ID);
/*创建取消按钮*/
btnCanceIId=wwmButtonCreate (appld,“取消", 200,170,50,20,UGL_NULL, 0, UGL_NULL);
wincbAdd(btnCancelId,MSG_BUTTDN_Select,UGL_NULL);
winAUath(btnCancelld,WinLoginId,UGL_NULL_ID);
…
/*创建输入框*/
tboxUserId=wwmTextboxCreate(appld,8,110,65,100,20,UGL_NULL,0,UGL_NULL);
tboxPwdId=wwmTextboxCreate(appld,8,110,110.l00,20,UGL_NULL,0, UGL_NULL);
winAttach(tboxUserId,winLoginld,UGL_NULL_ID);
winAttach(tboxPwdId,winLoginId,UGL_NULL_ID);
/*MSG_DRAW的回调函数部分内容*/
rect=pMsg->data.dxaw.rect;
gcId=pMsg->data.draw.gcId;
/*绘制窗体内的文本*/
uglLineWidthSet(gcId,l);
uglBackgroundColorSet(gcId,UGL_COLOR_TRANSPARENT);
uglForegroundColorSet(gcId,WIN_ RED);
uglFontSet (gcId, WIN_FONT_SONG24);
pText=“系统登录”;
uglTextSizeGetW(WIN_FONT_SONG24,&width,&height,strlen(pText)/2,
(UGL_WCHAR *)pText;
uglTextDrawW(gcId,(rect.left+rect.right-width)/2,20,strlen(pText)/2,(UGL_WCHAR*)pText);
/*绘制输入框前的提示文本*/
uglForegroundColorSet(gcId,WIN_BlACK);
uglFontSet(gcId,WIN_FONT_SONG12);
pText=”账号”;
uglTextDrawW(gcId,70,65,strlen(pText)/2,(UGL_WCHAR*)pText);
pText=”密码:”;
uglTextDrawW(gcId,70,110,strlen(pText)/2,(UGL_WCHAR*)pText);
5结语
本文讨论了VxWorks下基于WindML的窗口化图形界面设计基本原理和方法。在实际开发测试中,WindML具有方便灵活、开发自由度较大、消耗资源较少的特点,是VxWorks系统下开发图形用户界面的有力工具。
参考文献参考文献:
\[1\]陈翌,田健,王金俐.嵌入式软件开发技术[M].北京:国防工业出版社,2003.
[2]WIND RIVER SYSTEMS INC.WindML SDK programmers guide 3.0 [EB/OL].http://www.doc88.com/p-14465587484.html,2002.
[3]WIND RIVER SYSTEA INC. WindML DDK programmers guide 3.0[Z].Alameda: Wind River Systems Inc,2002.
责任编辑(责任编辑:杜能钢)