嵌入式操作系统-Windows CE 2.ppt
嵌入式操作系统Windows CE第七章 用户界面与图形子系统内容提要GWES概述设计Windows用户界面定制用户界面定制用户界面1 GWES概述GWESGraphicsWindowingEvent ManagerSubsystemWin32 应用编程接口(API),用户界面(UI),和图形设备接口(GDI)库的组合 是用户、应用程序和操作系统之间的接口GWES集成GDI,窗口管理器和事件管理器。GWES模块是Windows CE中最高度组件化的部分,包括两个子群USER处理消息、事件、用户输入GDI负责图形输出GWES组件模型最小配置用于创建最基本的Windows CE版本,包括操作系统内核(Core.d11)和选定的GWES支持组件,如消息处理用户输入电源管理而不显示UI,也不包括窗口管理功能中等配置包括操作系统核心并支持以下GWES功能消息处理及用户输入电源管理提示性发光二极管(LED)GDI,包括Microsoft TrueType字体和光栅字体,文本绘制,调色板和打印可定制的触摸和校准UI网络UI对话波形API管理器输入方法管理器(IMM)窗口和对话管理可定制UI完全配置包含所有的GWES组件Windows CE图形子系统的结构消息框对话框管理器OOMSplash类窗口管理器事件管理器编辑框列表框组合框按钮菜单 控件1.1 USER系统系统三个核心组件消息队列事件管理器用户输入系统USER部分的主要结构部分的主要结构应用程序应用程序驱动程序键盘驱动程序触摸设备驱动程序显示驱动程序用户输入系统前台窗口活动窗口焦点窗口光 标剪贴板Wmbase窗口管理器WinmgrGDI消息循环系统SendMessage()PostMessage()GWEMsgque消息处理消息消息标识符(识别消息的命名常数)创建一个窗口时发送WM_CREATE删除一个窗口时发送WM_DESTROY窗口客户区改变需要重绘时发送WM_PAINT可选参数意义和取值取决于消息标识符可为整数、组合位标志、结构指针或其它信息消息队列的功能接收消息并将消息发送到相应的窗口保存输入状态信息,比如光标的大小、提示符闪烁率等消息传送的两个基本函数SendMessage()同步消息传送机制消息队列和线程一一对应PostMessage()异步消息传送机制每个窗口都和一个与特定线程相关的消息队列联系在一起窗口是消息传送的目的地其它消息处理函数GetMessage从消息队列中得到消息DispatchMessage将GetMessage找回的消息分发给一个窗口程序 TranslateMessage将一个键盘消息转换为字符消息TranslateAccelerator处理菜单命令对应的加速键IsDialogMessage确定一个消息是否为一个对话框所需要,如果是则处理这个消息PeekMessage检索一个消息,并存放这个检索信息到结构RegisgerWindowsMessage定义一个新的窗口消息,它保证将在整个系统中均可使用SendMessage的同线程消息处理流程WndProc().接收消息队列发送消息堆栈绘图请求消息列表其他发送消息队列.SendMessage(hWnd);SendMessage的异线程消息处理流程WndProc().接收消息队列发送消息堆栈绘图请求消息列表其他发送消息队列.SendMessage(hWnd);接收消息队列发送消息堆栈绘图请求消息列表其他发送消息队列GetMsg(&msg)PostMessage的消息处理流程接收消息队列发送消息堆栈绘图请求消息列表其他发送消息队列WndProc().GetMessage(&msg)DispatchMessage(&msg).PostMessage(hWnd);.输入管理输入管理由一套子系统完成,负责处理以下几个相互关联的窗口活动窗口每个线程有一个特定的窗口称为活动窗口焦点窗口活动窗口和其子窗口可以是焦点窗口焦点窗口能够接收来自键盘的消息前台窗口系统中一个特定的线程或者消息队列称为前台线程,前台线程中的活动窗口是前台窗口SetActiveWindow()SetFocus()SetForegroundWindow()焦点窗口活动窗口三个窗口的关系图发送消息队列.接收输入事件的合适窗口输入消息队列键盘输入消息触摸设备输入消息窗口管理器PostMessage()PostMessage()触摸设备驱动程序键盘驱动程序GWE输入线程触摸输入事件和键盘输入事件的处理Windows CE支持的用户输入的类型键盘鼠标触摸屏和输入笔输入面板手写体识别键盘输入模型键盘扫描码键盘设备驱动程序消息系统消息队列消息线程消息队列消息线程消息循环消息窗口过程系统消息队列虚键码转换消息字符处理键盘消息窗口以击键消息和字符消息的形式接收键盘输入非系统击键WM_KEYDOWNWM_KEYUP系统击键WM_SYSKEYDOWNWM_SYSKEYIPWM_KEYDOWN消息收到此消息时,应该检查消息中包含的虚键码,以确定如何处理击键,虚键码包含在消息的wParam参数中。另外通常程序只处理非字符键产生的击键。典型代码框架:case WM_KEYDOWN:switch(wParam)Case VK_HOME:Break;Case VK_END:Break;Default:Break;字符消息用户输入字符时,Windows CE并不自动产生字符消息,而是产生击键消息。应用程序消息循环应调用TranslateMessage函数将击键消息转换为相应的字符消息Windows CE的四条字符消息WM_CHARWM_SYSCHARWM_DEADCHARWM_SYSDEADCHAR接收来自输入笔的输入通过输入笔在触摸屏上的点击可完成类似鼠标的操作。Windows CE支持的输入笔的消息WM_LBUTTONDBLCLK 用户双击屏幕WM_LBUTTONDOWN 用户单击屏幕WM_LBUTTONUP 用户从屏幕上抬起输入笔WM_MOUSEMOVE 用户在笔尖接触屏幕时移动输入笔接收来自输入面板的输入没有键盘输入的Windows CE设备需要模拟键盘输入的输入方法(IM),Windows CE实现了一个通过触摸屏操作的输入面板结构 Windows CE lM需要两个部分:软件输入面板子系统IM输入面板子系统完成非键盘输入到键盘事件的转换,也负责管理软件输入方法输入面板通信示意图输入面板调用IInputMethod借口创建IM,然后就可以接收用户输入IM通过IIMCallback接口将数据传输给输入面板应用程序键盘驱动分发系统GWES键盘事件输入面板IIMCallbackIMIInPutMethod手写识别Windows CE.NET手写体识别引擎目前能够识别ASCII字符集的所有94个字符各种图形字符,如中文、日文、韩文,并产生相应的Unicode输出HWXGUIDE结构定义用于字符输入的识别框的大小和位置基线(cyBase)和中线(cyMid)主要用于识别字符,对于识别图形字符不需要 使用多个识别框时,偏移参数在各个识别框之间形成了一定的缓冲区,以防止一个识别框内的字符覆盖另一个识别框的字符 手写体识别过程1.调用HwxConfig函数:为应用程序初始化识别引擎2.调用HwxCreate函数:创建HRC(手写识别上下文)对象3.调用HwxSetGuide函数:定义处理用户输入的识别框4.调用HwxALCValid和HwxALCPriority函数:定义识别准则5.调用HwxSetContext函数:向HRC对象传递早先识别的字符6.当用户书写时,调用HwxInput函数:向HRC对象传送手写数据7.调用HwxProcess函数:向识别引擎传递HRC对象注:如果使用不完全识别(用于识别汉语等复杂的多笔划语言字符),则对于每个输入笔划重复步骤78.调用HwxResultsAvailable函数:获得已经识别的字符数9.调用HwxGetResults函数:获得识别引擎结果10.调用HwxDestroy函数:删除当前的HRC对象,表示识别过程的完成用于控制文本和图形的显示使用GDI 画直线,曲线,闭合图形、文本、位图等 GDI使用设备上描述表(DC)存储特定设备的绘图的属性,包括画笔、画刷、字体、位图、调色板等Windows CE 支持打印机设备描述表、显示设备描述表和内存设备描述表1.2 GDI(Graphics Device Interface)Windows CE支持的GDI功能光栅字体和TrueType字体定制彩色调色板以及调色和非调色的彩色显示设备块传输功能和光栅操作码笔和刷子打印光标形状绘制功能Windows CE不支持的GDI功能坐标空间转换函数,坐标设备与设备空间等价时区变换API彩色光标class GDIOBJpublic:static HTABLE*m_pHTable;/句柄表句柄表INT16 m_nCount;/引用计数引用计数UINT16 m_nIndex;/句柄表索引句柄表索引GDIOBJ();GDIOBJ();ULONG Increment();ULONG Decrement();void RemoveFromHandleTable();BOOL IsStockObject();virtual BOOL DeleteObject();virtual int GetObject(int CntBytesBuffer,void*pObject)=0;virtual DWORD GetObjectType()=0;virtual GDIOBJ*SelectObject(DC*)=0;基本基本GDI对象的基类对象的基类GDIOBJGDI的图形原语矩形折线多边形椭圆圆角矩形原语是由驱动程序画线和填充小区域实现的画线的工具:画笔填充区域的工具:刷子画笔普通画笔BLACK_PENWHITE_PENNULL_PEN用GetStockObject函数选择特殊画笔的定义项目线宽颜色画笔类型画笔类型画笔类型PS_SOLIDPS_DASHPS_NULL画实线画点划线不画线刷子刷子是用于描绘闭合形状内部区域的图形对象Windows CE支持三种类型的逻辑刷标准刷:Windows CE维护了21种标准刷实心刷:在8X8像素的正方形中包含64个同色像素模板刷:使用CreatePatternBrush 或CreateDIBPatternBrushPt来创建SelectObject函数将逻辑刷选入设备环境GetStockObject函数可以选择一种标准刷CreateDIBPatternBrushPt用来设计任何尺寸、颜色和模式的画刷原语转换成画笔和画刷以画矩形为例:调用设备驱动程序时,对于矩形区域内部使用一个画刷工具,而对于矩形外边缘,使用4个小区域。首先使用选入设备描述表中的画刷填充矩形区域内部,然后使用选入设备描述表中的画笔描绘矩形外边缘。Windows CE中支持的画笔由于考虑内存空间的局限性,Windows CE不支持在桌面Windows中支持的一些特殊画笔,如末端为方角形或斜角形,以及一些图形基本元素,如粗画笔、粗线椭圆等调色板调色板是输出设备能够显示的颜色的集合Windows CE没有标准彩色调色板,每次创建设备环境时,Windows CE将创建一个默认调色板不能改变默认调色板中的颜色,但是可以创建自己的逻辑调色板,并将它选入设备环境取代默认调色板创建逻辑调色板赋值LOGPALETTE结构的各成员,并将结构指针传递给CreatePalette函数调用SelectPalette函数将调色板选入当前设备环境调用RealizePalette函数使系统调色板与当前设备环境的调色板相同 位图位图是一个位数组,将其映射到输出设备上的矩形像素数组是就可以创建图像位图是可以用来在设备环境中创建、绘制、操作和检索图像的图形对象可以将位图想象为一种由象素阵列组成的图画,这些象素可以在屏幕上显示出来分类:设备相关位图(DDB)设备无关位图(DIB)Windows CE支持独有的4色位图格式DDB是依赖于特定DC特征的位图,并且不能很容易地移植到具有不同特征的DC没有自己的颜色表,只有在与创建位图的设备具有相同的显存结构的设备上才能正确显示Windows CE支持1、2、4、8、16、24和32位颜色创建DDB调用CreateCompatibleDC创建一个与指定设备兼容的内存设备环境使用函数CreateBitmap和CreateCompatibleBitmap来创建位图CreateCompatibleBitmap创建了与传送给该函数的设备环境的格式兼容的位图当用CreateCompatibleDC函数返回的句柄进行绘制的,输出并不显不在设备的绘图表面,而是存储在内存中,调用BitBlt函数将位图数据从源设备环境中的位图复制到目标设备环境的位图StretchBlt函数将位图从源矩形复制到目标矩形,同时扩展或压缩位图以使位图和目标矩形匹配DIBDIB存储的图像中有它们自己的颜色信息使用CreateDIBSection来创建位图调用SelectObject函数将DIBSection选入设备环境DIB部件将内存DC与同样包含DC的位的缓冲区关联起来,以允许程序员在保持对组成位图的位的直接访问的同时在设备环境个选择DIB位图文件结构字体字体由它的字样、样式和大小表示字样决定了图案符号的特定特征,如字符中的粗笔划和细笔划的相对宽度样式决定了字体的重度(右浅到黑)和倾斜度(直体或斜体)Windows CE支持光栅字体和TrueType字体技术,但在特定系统中只能使用一种类型的字体,而且是在设计系统时决定的,应用程序无法改变光栅字体利TrueType字体之间的区别与每个字符或符号的图案在各自的字体资源文件中的存储方式有关光栅字体的图案符号是一个表示单一字符的小位图,通常被认为与设备相关,不易缩放TrueType字体的图案符号包含轮廓和提示,被认为与设备无关,易于缩放字体(续)字体的图案符号存储在字体资源文件中光栅字体的字体资源文件存储在一个.fot文件中TrueType字体有两个文件:一个小的.fot头文件和一个包含实际数据的.ttf文件使用字形高速缓冲存储器来减少显示字形的时间有两种控制它的方法在建立Windows CE系统时就设置好它的大小当字体被丢弃时在Windows CE系统上运行独立的应用程序进行控制和字体句柄相联系默认容量为4KBLOGFONT结构在系统内部,字体是以一个LOGFONT结构来表示的。其结构成员意义如下表成员意义成员意义lfHeight设备单元中字体的高度lfStrikeOut是否加删除线lfWidth平均的字符宽度lfCharSet选择的字符集lfEscapement以0.1为单位指定每行文本输出时相对于页面底端的角度LfOutPrecision输出精度lfOrientation以0.1为单位指定字符基线 相对于页面底端的角度lfClipPrecision剪辑精度lfWeight字体重量(范围0-1000)lfQuality输出质量lfItalic是否斜体lfPitchAndFamily字符间距和选择的字体族lfUnderline是否加下划线lfFaceNameLF_FACESIZE字体名Windows CE提供字体连接功能,从而可以用基字体显示基字体中不存在被连接字体中存在的字符枚举注册表登基键枚举注册表登基键HKEY_LOCAL_MACHINESOFTWAREMicrosoftFontLinkSystemLink 的子键可以得到被连接字体和基字体之间的映射情况增加附加的连接:创建附加的子键base font face name=path and file to link to,face name of the font to link 允许字体连接基字体被连接字体连接创建用户自定义字符最终用户定义的字符(EUDC)可以为设备定义字符或图案符号EUDC总是需要与一个双字节字符集(DBCS)和一种TrueType字体相关联创建EUDC1.在指定范围或保留字符的范围内选择一个字符值2.用EUDC编辑器创建字符的形状和样式3.向TrueType字体中相应于选择的字符值的记录中增加形状和样式信息EUDC字体与另一种字体关联1.将EUDC字体复制到一个文件夹中,EUDC字体文件的扩展名是.tte2.调用EnableEUDC(FALSE)3.修改HKEY_CURRENT_USEREUDC注册表登记键4.在HKEY_CURRENT_USEREUDC下创建子键5.在上步创建的子键中输入包含EUDC的字体路径 6.调用EnableEUDC(TRUE)使用字体的函数CreateFontIndirect 创建字体 GetTextMetrics查询字体特征EnumFontFamilies 枚举字体显示驱动程序接口(DDI)是Windows NT DDI的子集,仅使用了最基本的图形引擎函数和驱动程序函数显示设备驱动程序和Windows NT的差别一般都具有相同的功能,GDI并不查询确定程序的参数及性能信息遇到复杂操作时显示驱动程序将回调GDI,将操作分成简单的几步被编译成DLL文件而LIB文件显示驱动程序必须实现一套DDI函数,以完成初始化和显示图像的功能显示驱动程序还使用图形原语引擎(GPE)类,提供了基本的代码,使用这些代码导出硬件的显示驱动程序,提高了开发和测试效率,而且使显示驱动程序对硬件加速更加容易GDI的组件的组件2 设计Windows用户界面设计原则设计原则设计窗口和对话框设计窗口和对话框设计菜单设计菜单选择控件选择控件使用颜色的原则使用颜色的原则使用图标使用图标给予用户控制权使用熟悉的概念保持一致性允许交互式发现提供反馈信息强调美观简化设计支持多种输入方法设计原则设计窗口和对话框Windows CE不支持用户改变窗口大小三种对话框应用程序定义的对话框消息框属性表单当X和OK执行同一函数时,选OK不要同时在对话框和命令栏中同时放OK按钮原则对话框中的按钮设计菜单Windows CE不支持菜单栏,而是将菜单栏和工具栏组合为命令栏四种类型的菜单弹出式滚动式级联式下拉式使用命令栏 为了尽量扩大客户区屏幕可用尺寸,Windows CE支持一种新的控件命令栏组合了菜单栏、工具栏和可选的地址栏命令栏的长度可以从240像素到640像素这取决于屏幕的分辨率Windows CE支持多个命令栏命令栏里可以放置组合框编辑框按钮选择控件窗口控件发送WM_COMMAND消息公共控件发送WM_NOTIFY消息基础控件文件控件标度控件信息控件杂类控件窗口控件复选框下压按钮组合框编辑控件滚动条单选按钮组框下拉式列表框列表框静态控件基础控件命令条命令栏工具栏属性表单卡片控件Rebar控件文件控件标题头控件图像列表树形视图列表视图旋转框轨迹条信息控件进度条日期和时间选择器状态栏日历工具提示杂类控件HTML浏览器Rich Ink语音录制器使用颜色的原则屏幕上一次显示的颜色不超过四种,整个应用程序使用的颜色不超过八种将颜色与其他强调技术一 起使用,以区分界面上的区域或识别重要功能避免使用频谱梢对的颜色组合,如红和蓝或黄和紫,它们会图像显得模糊设计应用程序时主要考虑灰度级显示器用颜色对比度提高视图效果,一旦用户的眼睛适应了模糊的颜色,可能就无法辨别避免使用缺乏对比度的颜色和具有相同亮度的颜色,这些颜色不易区分使用黑色、白色和灰色提高分辨率使用通用的颜色关联提高熟悉程度,如红色表示停止,绿色表示前进使用图标图标表示属性或任务,有效的图标可以清楚地表现其功能图标通常用于按钮上,但也可以用于进度指示器3 定制用户界面创建一个皮肤可以换肤的控件皮肤示例代码其它用户界面定制项目3.1 创建皮肤皮肤允许定制控件及其它用户界面元素的外表通过修改默认的关于控件及窗口的非客户区的drawing代码来创建定制用户界面每个控件对应一个C类需要改变类的方法的实现实例XP皮肤创建皮肤(续)通过更改皮肤可以适应限制、增加灵活性及丰富产品的外表Windows CE将可换肤的元素的drawing代码和其它代码分开,以支持创建皮肤Drawing代码所在的文件的目录$(_WINCEROOT)publiccommonoakdriversskinnableuiPlatform Builder自动将更改后的实现并入GWES模块,并包含在操作系统中3 定制用户界面创建一个皮肤可以换肤的控件皮肤示例代码其它用户界面定制项目3.2 可以换肤的控件公共控件标题头控件、进度条、Rebar、工具条和跟踪条窗口控件按钮、组合框、列表框、滚动条、静态控件控件所在路径$(_WINCEROOT)publiccommonoakdriversskinnableUIgwe定制控件的原则避免使用以下控件难以使用的控件挨的太近的控件难以理解的控件难以区别的的控件被隐藏的控件不可预测的控件3 定制用户界面创建一个皮肤可以换肤的控件皮肤示例代码其它用户界面定制项目3.3 代码位置:buttonview.cppVoid ButtonView_t:DrawGroupBoxText(HWND hwnd,/*窗口句柄*/HBRUSH hbr,/*刷子*/HDC hdc,/*设备环境*/WORD alignment/*对齐*/)RECT rc;CalcRect(hwnd,hdc,&rc,CBR_GROUPTEXT,0,alignment);/*计算矩形*/GweBypassCoredllThunk_t:InvalidateRect_I(hwnd,&rc,TRUE);/*使矩形无效*/PaintRect(GweBypassCoredllThunk_t:GetParent_I(hwnd),hwnd,hdc,hbr,&rc);/*重绘矩形*/return;通过更改代码来实现定制皮肤,如更改对齐等3 定制用户界面创建一个皮肤可以换肤的控件皮肤示例代码其它用户界面定制项目3.4 其它用户界面定制项目非客户区窗口系统颜色字体操作系统用户界面组件内存不足用户对话框启动用户界面触摸屏刻度屏非客户区窗口更改代码的位置:WINCE400publiccommonoakdriversskinnableuigwenclientNclientview.cpp可以更改的方法(类NonClientView_t)BoundingRect BoundPointCalcClientRectWithHorzScrollBarsCalcClientRectWithNoScrollBarsCalcClientRectWithVertScrollBarsDoesHorzScrollBarFit DoesVertScrollBarFit DoHitTest DoPaint DrawBorder DrawFrameControl ExposedDrawFrameControl WidgetRect系统颜色通过更改注册表入口来实现定制颜色:HKEY_LOCAL_MACHINESYSTEMGWESysColor此入口包含了27个DWORD值字体通过定制字体可以改变操作系统的外表Windows CE 允许以下操作:替换字体指定操作系统装载字体的路径使能ClearType使能反锯齿字体使能字体连接改变帮助系统字体大小使能最终用户定义的字符(EUDC)使能非罗马字体的线条断开,例如亚洲语言字符内存不足对话框当内存低时跳出以便用户重新分配对象存储定制此对象的目录WINCE400publiccommonoakdriversoomUI.启动用户界面用户唤醒设备时出现更改代码的目录WINCE400publiccommonoakdriversstartUI.触摸屏校准屏幕触摸屏校准组件用于物理位置到屏幕坐标的映射更改代码的目录WINCE400publiccommonoakdriversCalibrUI操作系统用户界面组件总结GWES概述概述USERGDI设计设计Windows用户界面用户界面设计原则设计原则设计窗口和对话框设计窗口和对话框设计菜单设计菜单选择控件选择控件使用颜色的原则使用颜色的原则使用图标使用图标定制用户界面定制用户界面创建一个皮肤创建一个皮肤可以换肤的控件可以换肤的控件皮肤示例代码皮肤示例代码其它用户界面定制项目其它用户界面定制项目资源Microsoft Windows CE 用户界面服务指南,(美)微软公司 著,希望图书创作室 译,北京希望电子出版社,1999 Windows CE.NET系统分析及试验教程,陈向群 王雷 马洪兵 向勇 等编著,机械工业出版社,2003 Windows CE.NET helpMSDN libraryMicrosoft Windows CE.NET train:2540_Developing Embedded Solutions for Windows CE.NETWindows CE.NET内核定制及应用开发,周毓林 宁杨 陆贵强 付林林 编著,电子工业出版社,2005