850 likes | 1.11k Views
嵌入式操作系统原理 —— Windows CE. 第七章 用户界面与图形子系统. 内容提要. GWES 概述 设计 Windows 用户界面 定制用户界面. 1 GWES 概述. GWES G raphics W indowing E vent Manager S ubsystem Win32 应用编程接口 (API), 用户界面 (UI), 和 图形设备接口 (GDI) 库的组合 是用户、应用程序和操作系统之间的接口 GWES 集成 GDI, 窗口管理器和事件管理器。 GWES 模块是 Windows CE 中最高度组件化的部分,包括两个子群
E N D
嵌入式操作系统原理 ——Windows CE 第七章 用户界面与图形子系统
内容提要 • GWES概述 • 设计Windows用户界面 • 定制用户界面
1 GWES概述 • GWES • Graphics • Windowing • Event Manager • Subsystem • Win32 应用编程接口(API), 用户界面 (UI), 和图形设备接口 (GDI)库的组合 • 是用户、应用程序和操作系统之间的接口 • GWES集成GDI,窗口管理器和事件管理器。 • GWES模块是Windows CE中最高度组件化的部分,包括两个子群 • USER——处理消息、事件、用户输入 • GDI——负责图形输出
最小配置用于创建最基本的Windows CE版本,包括操作系统内核(Core.d11)和选定的GWES支持组件,如 消息处理 用户输入 电源管理 而不显示UI,也不包括窗口管理功能 中等配置包括操作系统核心并支持以下GWES功能 消息处理及用户输入 电源管理 提示性发光二极管(LED) GDI,包括Microsoft TrueType字体和光栅字体,文本绘制,调色板和打印 可定制的触摸和校准UI 网络UI对话 波形API管理器 输入方法管理器(IMM) 窗口和对话管理 可定制UI GWES组件模型 • 完全配置包含所有的GWES组件
OOM Splash类 消息框 对话框管理器 窗口管理器 事件管理器 编 辑 框 列 表 框 组 合 框 按 钮 菜 单 控件 …… Windows CE图形子系统的结构
1.1 USER系统 • 三个核心组件 • 消息队列 • 事件管理器 • 用户输入系统
前台窗口 Winmgr 光 标 活动窗口 窗口管理器 应用程序 用户输入系统 焦点窗口 剪贴板 Wmbase GDI 驱动程序 键盘驱动程序 触摸设备驱动程序 显示驱动程序 USER部分的主要结构 应用程序 Msgque GWE 消息循环系统 SendMessage() PostMessage()
消息处理 • 消息 • 消息标识符(识别消息的命名常数) • 创建一个窗口时发送WM_CREATE • 删除一个窗口时发送WM_DESTROY • 窗口客户区改变需要重绘时发送WM_PAINT • 可选参数 • 意义和取值取决于消息标识符 • 可为整数、组合位标志、结构指针或其它信息
消息队列的功能 • 接收消息并将消息发送到相应的窗口 • 保存输入状态信息,比如光标的大小、提示符闪烁率等
消息传送的两个基本函数 • SendMessage() • 同步消息传送机制 • 消息队列和线程一一对应 • PostMessage() • 异步消息传送机制 • 每个窗口都和一个与特定线程相关的消息队列联系在一起 • 窗口是消息传送的目的地
SendMessage的同线程消息处理流程 . . . SendMessage(hWnd…); 发送消息队列 WndProc( ) . . . 接收消息队列 发送消息堆栈 绘图请求 消息列表 其他
SendMessage的异线程消息处理流程 . . . SendMessage(hWnd…); 发送消息队列 发送消息队列 接收消息队列 接收消息队列 发送消息堆栈 发送消息堆栈 GetMsg(&msg) 绘图请求 消息列表 绘图请求 消息列表 WndProc( ) . . . 其他 其他
PostMessage的消息处理流程 GetMessage(&msg) DispatchMessage(&msg) . . PostMessage(hWnd…); . . 发送消息队列 接收消息队列 发送消息堆栈 WndProc( ) . . . 绘图请求 消息列表 其他
输入管理 • 输入管理由一套子系统完成,负责处理以下几个相互关联的窗口
三个窗口的关系图 SetActiveWindow(…) SetFocus(…) SetForegroundWindow(…) 活动窗口 焦点窗口
发送消息队列 . . . 触摸输入事件和键盘输入事件的处理 输入消息队列 GWE输入线程 键盘输入消息 触摸设备输入消息 PostMessage() 窗口管理器 PostMessage() 触摸设备 驱动程序 键盘驱 动程序 接收输入事件的合适窗口
Windows CE支持的用户输入的类型 • 键盘 • 鼠标 • 触摸屏和输入笔 • 输入面板 • 手写体识别
键盘输入模型 键盘 扫描码 键盘设备驱动程序 消息 虚键码 转换消息 字符 系统消息队列 消息 系统消息队列 线程消息队列 消息 线程消息循环 消息 窗口过程
处理键盘消息 • 窗口以击键消息和字符消息的形式接收键盘输入 • 非系统击键 • WM_KEYDOWN • WM_KEYUP • 系统击键 • WM_SYSKEYDOWN • WM_SYSKEYIP
WM_KEYDOWN消息 • 收到此消息时,应该检查消息中包含的虚键码,以确定如何处理击键,虚键码包含在消息的wParam参数中。另外通常程序只处理非字符键产生的击键。典型代码框架: case WM_KEYDOWN: switch(wParam) { Case VK_HOME:……Break; Case VK_END:……Break; …… Default:……Break; }
字符消息 • 用户输入字符时,Windows CE并不自动产生字符消息,而是产生击键消息。 • 应用程序消息循环应调用TranslateMessage函数将击键消息转换为相应的字符消息 • Windows CE的四条字符消息 • WM_CHAR • WM_SYSCHAR • WM_DEADCHAR • WM_SYSDEADCHAR
接收来自输入笔的输入 • 通过输入笔在触摸屏上的点击可完成类似鼠标的操作。 • Windows CE支持的输入笔的消息 • WM_LBUTTONDBLCLK —用户双击屏幕 • WM_LBUTTONDOWN —用户单击屏幕 • WM_LBUTTONUP —用户从屏幕上抬起输入笔 • WM_MOUSEMOVE —用户在笔尖接触屏幕时移动输入笔
接收来自输入面板的输入 • 没有键盘输入的Windows CE设备需要模拟键盘输入的输入方法(IM),Windows CE实现了一个通过触摸屏操作的输入面板结构 • Windows CE lM需要两个部分: • 软件输入面板子系统 • IM • 输入面板子系统完成非键盘输入到键盘事件的转换,也负责管理软件输入方法
输入面板调用IInputMethod借口创建IM,然后就可以接收用户输入输入面板调用IInputMethod借口创建IM,然后就可以接收用户输入 IM通过IIMCallback接口将数据传输给输入面板 应用程序 键盘驱动分发系统 GWES 键盘事件 输入面板 IInPutMethod IIMCallback IM 输入面板通信示意图
手写识别 • 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对象 注:如果使用不完全识别(用于识别汉语等复杂的多笔划语言字符),则对于每个输入笔划重复步骤7 8.调用HwxResultsAvailable函数:获得已经识别的字符数 9.调用HwxGetResults函数:获得识别引擎结果 10.调用HwxDestroy函数:删除当前的HRC对象,表示识别过程的完成
1.2 GDI(Graphics Device Interface) • 用于控制文本和图形的显示 • 使用GDI 画直线,曲线,闭合图形、文本、位图等 • GDI使用设备上描述表 (DC)存储特定设备的绘图的属性,包括画笔、画刷、字体、位图、调色板等 • Windows CE 支持打印机设备描述表、显示设备描述表和内存设备描述表
Windows CE支持的GDI功能 • 光栅字体和TrueType字体 • 定制彩色调色板以及调色和非调色的彩色显示设备 • 块传输功能和光栅操作码 • 笔和刷子 • 打印 • 光标 • 形状绘制功能
Windows CE不支持的GDI功能 • 坐标空间转换函数,坐标设备与设备空间等价 • 时区变换API • 彩色光标
基本GDI对象的基类-GDIOBJ class GDIOBJ{ public: 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的图形原语 • 矩形 • 折线 • 多边形 • 椭圆 • 圆角矩形 • 原语是由驱动程序画线和填充小区域实现的 • 画线的工具:画笔 • 填充区域的工具:刷子
画笔 • 普通画笔 • BLACK_PEN • WHITE_PEN • NULL_PEN • 用GetStockObject函数选择 • 特殊画笔的定义项目 • 线宽 • 颜色 • 画笔类型
刷子 • 刷子是用于描绘闭合形状内部区域的图形对象 • 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函数将位图从源矩形复制到目标矩形,同时扩展或压缩位图以使位图和目标矩形匹配
DIB • DIB存储的图像中有它们自己的颜色信息 • 使用CreateDIBSection来创建位图 • 调用SelectObject函数将DIBSection选入设备环境 • DIB部件将内存DC与同样包含DC的位的缓冲区关联起来,以允许程序员在保持对组成位图的位的直接访问的同时在设备环境个选择DIB
字体 • 字体由它的字样、样式和大小表示 • 字样决定了图案符号的特定特征,如字符中的粗笔划和细笔划的相对宽度 • 样式决定了字体的重度(右浅到黑)和倾斜度(直体或斜体) • Windows CE支持光栅字体和TrueType字体技术,但在特定系统中只能使用一种类型的字体,而且是在设计系统时决定的,应用程序无法改变 • 光栅字体利TrueType字体之间的区别与每个字符或符号的图案在各自的字体资源文件中的存储方式有关 • 光栅字体的图案符号是一个表示单一字符的小位图,通常被认为与设备相关,不易缩放 • TrueType字体的图案符号包含轮廓和提示,被认为与设备无关,易于缩放
字体(续) • 字体的图案符号存储在字体资源文件中 • 光栅字体的字体资源文件存储在一个.fot文件中 • TrueType字体有两个文件:一个小的.fot头文件和一个包含实际数据的.ttf文件 • 使用字形高速缓冲存储器来减少显示字形的时间 • 有两种控制它的方法 • 在建立Windows CE系统时就设置好它的大小 • 当字体被丢弃时在Windows CE系统上运行独立的应用程序进行控制 • 和字体句柄相联系 • 默认容量为4KB
LOGFONT结构 • 在系统内部,字体是以一个LOGFONT结构来表示的。其结构成员意义如下表
允许字体连接 • Windows CE提供字体连接功能,从而可以用基字体显示基字体中不存在被连接字体中存在的字符 • 枚举注册表登基键HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\FontLink\SystemLink的子键可以得到被连接字体和基字体之间的映射情况 • 增加附加的连接:创建附加的子键 • "base font face name" = "path and file to link to," "face name of the font to link" 连接 被连接字体 基字体
创建用户自定义字符 • 最终用户定义的字符(EUDC)可以为设备定义字符或图案符号 • EUDC总是需要与一个双字节字符集(DBCS)和一种TrueType字体相关联