首页资源分类嵌入式系统 > emwin5.12 中文手册

emwin5.12 中文手册

已有 451559个资源

相关资源

    下载专区

    上传者其他资源

      嵌入式系统热门资源

      本周本月全部

      文档信息举报收藏

      标    签:emwin

      分    享:

      文档简介

      仅有的中文资料,绝对好用

      文档预览

      emWin 图形库 图形用户界面 版本 5.12 手册修订版 0 www.segger.com 嵌入式软件的解决方案 2 章节 免责声明 本文中所含的规格信息据信是准确的,但不担保完全没有错误。本手册中所含信息可能会因功能或性 能改善而变更,恕不另行通知。请确保您手中的手册是最新版本。虽然此处所提供信息据信是准确的, 但如有任何错误或疏漏, SEGGER Microcontroller GmbH & Co. KG (制造商)概不承担任何责 任。制造商不作 (用户因而也不会获得)任何担保或条件,无论是明示的、暗含的、法定的还是以任 何函件形式与用户确认的。特别地,制造商拒绝承担任何适销性或特定目的适用性的担保。 版权声明 如无制造商的事先书面许可,不得截取本手册的任何部分或者以任何方式修改 PDF 文件。本文件中所 述软件基于许可证提供,且只能根据此许可证的条款进行使用或复制。 © 2011 SEGGER Microcontroller GmbH & Co. KG, Hilden / 德国 商标 本手册中提及的名称可能是其各自所属公司的商标。 各品牌和产品名称均为其各自所有者的商标或注册商标。 注册 请通过电子邮件注册软件。这样,我们就能确保在有更新时,您会立即收到更新或者更新通知。 注册时,请提供以下信息: • 公司名称和地址 • 您的姓名 • 您的职位 • 您的电子邮件地址和电话号码 • 产品名称和版本 请将这些信息发送至:register@segger.com 联系地址 SEGGER Microcontroller GmbH & Co. KG In den Weiden 11 D-40721 Hilden 德国 电话:+49 2103-2878-0 传真:+49 2103-2878-28 电子邮件:support@segger.com 网址:http://www.segger.com 手册版本 本手册讲述的是最新软件版本。软件的版本编号请见本章节稍后的 “软件版本”表。如有任何差错, 请通知我们,我们将尽快尽力为您提供帮助。 有关任何未明确的其他信息和程序,请联系我们。 印刷日期:12/9/11 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 3 版本 5.12R0 5.10R1 5.10R0 日期 110621 110531 110329 作 者 描述 第 17 章 “窗口对象 (小工具)” - 添加新函数 LISTVIEW_SetHeaderHeight()。 - 添加新函数 ICONVIEW_AddStreamedBitmapItem()。 - 添加新函数 ICONVIEW_GetItemText()。 - 添加新函数 ICONVIEW_GetItemUserData()。 - 添加新函数 ICONVIEW_GetNumItems()。 - 添加新函数 ICONVIEW_InsertBitmapItem()。 - 添加新函数 ICONVIEW_InsertStreamedBitmapItem()。 - 添加新函数 ICONVIEW_SetBitmapItem()。 - 添加新函数 ICONVIEW_SetFrame()。 - 添加新函数 ICONVIEW_SetItemText()。 AS - 添加新函数 ICONVIEW_SetItemUserData()。 JE - 添加新函数 ICONVIEW_SetSpace()。 - 添加新函数 ICONVIEW_SetStreamedBitmapItem()。 - 添加新函数 ICONVIEW_SetTextAlign()。 - 添加新函数 TEXT_GetNumLines()。 第 30 章 “显示驱动” - 添加新显示驱动: GUIDRV_Dist GUIDRV_SPage - GUIDRV_CompactColor_16 支持的新显示控制器: 66709:所罗门 SSD1961 - LCD_SetDevFunc():添加 LCD_DEVFUNC_COPYRECT。 - GUIDRV_Lin:添加对 LCD_DEVFUNC_COPYRECT 的支持。 AS 第 30 章 “显示驱动” JE - 新显示驱动:GUIDRV_FlexColor 第 14 章 “存储设备” - GUI_USE_MEMDEV_1BPP_FOR_SCREEN 的默认值是 1。 - 添加新函数 GUI_MEMDEV_MarkDirty()。 添加第 19 章 “GUIBuilder”。 AS 第 30 章 “显示驱动” JE - GUIDRV_CompactColor_16 支持的新显示控制器: 66708: Ilitek ILI9328 66709: Sitronix ST7715 66772: Ilitek ILI9221 - 添加新函数 GUIDRV_BitPlains_Config()。 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 4 章节 版本 5.08R0 5.06R0 日期 110112 100907 作 者 描述 第 9 章 “2D 图形库” - 添加新函数 GUI_CreateBitmapFromStreamRLEAlpha()。 - 添加新函数 GUI_CreateBitmapFromStreamRLE32()。 - 函数 GUI_CreateBitmapFromStream() 支持额外格式。 - 添加新函数 GUI_UC_EnableBIDI()。 第 12 章 “位图转换器” - 添加新格式 “Alpha 通道,压缩”。 - 添加新格式 “带 Alpha 通道的真彩色,压缩”。 - 添加新功能 Image/Convert Into/Best Palette + transparency。 第 14 章 “存储设备” - 添加新函数 GUI_MEMDEV_SetAnimationCallback()。 - 添加新函数 GUI_MEMDEV_ShiftInWindow()。 - 添加新函数 GUI_MEMDEV_ShiftOutWindow()。 第 15 章 “执行模型” - 添加新函数 GUI_SetSignalEventFunc()。 - 添加新函数 GUI_SetWaitEventFunc()。 - 添加新函数 GUI_SetWaitEventTimedFunc()。 - 编译时间配置宏的定义变更。 第 16 章 “窗口管理器” - 添加新函数 WM_MULTIBUF_Enable()。 AS JE - 添加新消息 WM_PRE_PAINT 和 WM_POST_PAINT。 第 17 章 “小工具” - LISTVIEW_SetUserData() 重命名为 LISTVIEW_SetUserDataRow()。 - LISTVIEW_GetUserData() 重命名为 LISTVIEW_GetUserDataRow()。 - 为所有小工具添加新函数 _SetUserData。 - 为所有小工具添加新函数 _GetUserData。 - 为所有小工具添加新函数 _CreateUser。 - 添加新函数 BUTTON_GetTextAlign()。 - 添加新函数 BUTTON_SetReactOnLevel()。 - 添加新函数 ICONVIEW_CreateIndirect()。 - 添加新函数 ICONVIEW_DeleteItem()。 - 添加新函数 LISTWHEEL_CreateIndirect()。 - 添加新函数 SCROLLBAR_SetThumbSizeMin()。 - 添加新函数 SCROLLBAR_GetThumbSizeMin()。 - 添加新函数 TREEVIEW_ITEM_CollapseAll()。 - 添加新函数 TREEVIEW_ITEM_ExpandAll()。 第 19 章 “皮肤设置” - 添加新编译时间配置宏 WIDGET_USE_FLEX_SKIN。 - 新消息 WIDGET_ITEM_GET_RADIUS 添加到帧窗口皮肤。 第 20 章 “多重缓冲”。 - 添加新函数 GUI_MULTIBUF_Begin()。 - 添加新函数 GUI_MULTIBUF_End()。 - 添加新函数 GUI_MULTIBUF_Config()。 第 9 章 “字体”: - 添加新函数 GUI_SetDefaultFont()。 第 12 章 “存储设备”: - 添加新函数 GUI_MEMDEV_FadeDevices()。 第 15 章 “小工具”: - 添加新函数 SCROLLBAR_GetNumItems()。 - 添加新函数 SCROLLBAR_GetPageSize()。 JE - 添加新函数 BUTTON_SetReactOnLevel()。 - 添加新函数 LISTWHEEL_SetPos()。 - 添加新函数 GRAPH_DATA_XY_SetOwnerDraw()。 - 添加新函数 LISTVIEW_SetItemBitmap()。 新第 17 章 “皮肤设置”: - 为最通用小工具添加皮肤设置功能。 第 26 章 “显示驱动”: - 添加新函数 GUI_SetOrientation() (旋转设备)。 - 给 GUIDRV_Lin 添加用于 16、 24 和 32 bpp 的新 OXY 定向。 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 5 版本 5.04R2 5.04R1 5.04R0 日期 100526 100505 100104 作 者 描述 - 章节 “小工具”中的新函数 LISTVIEW_SetItemBitmap() - 章节 “小工具”中的新函数 GRAPH_DATA_XY_SetOwnerDraw() - 章节 “字体”中的新函数 GUI_SetDefaultFont() - 章节 “2-D 图形库”中的新函数 GUI_GetPixelIndex() AS - 章节 “执行模型”中的新函数 GUITASK_SetMaxTask() - GUIDRV_CompactColor_16: 添加对以下显示控制器的支持: Himax HX8353、 LGDP4551、 Orisetech SPFD54124C、 Renesas R61505、 矽创 ST7735 和 ST7787、所罗门 SSD1284 和 SSD2119。 - 给每个使用驱动宏的驱动添加宏。 添加驱动 “GUIDRV_S1D15G00”和 “GUIDRV_SLin” 各种修正 章节 “2-D 图形库”: - 新函数 GUI_DrawGradientRoundedV() - 新函数 GUI_DrawGradientRoundedH() - 新函数 GUI_DrawRoundedFrame() AS 第 12 章 “存储设备”: - 新函数 GUI_MEMDEV_MoveInWindow() - 新函数 GUI_MEMDEV_MoveOutWindow() - 新函数 GUI_MEMDEV_FadeInWindow() - 新函数 GUI_MEMDEV_FadeOutWindow() 章节 “模拟” - 新函数 SIM_GUI_SetCallback() - 新函数 SIM_GUI_ShowDevice() 第 26 章 “VNC 服务器”: - 添加新函数 GUI_VNC_EnableKeyboardInput()。 - 添加新函数 GUI_VNC_GetNumConnections()。 JE - 添加新函数 GUI_VNC_SetPassword()。 - 添加新函数 GUI_VNC_SetProgName()。 - 添加新函数 GUI_VNC_SetSize()。 - 添加新函数 GUI_VNC_RingBell()。 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 6 章节 版本 5.04R0 5.00R1 5.00R0 日期 100104 090409 090326 作 者 描述 第 5 章 “显示驱动”: - 添加新函数 GUI_DispStringInRectWrap()。 - 添加新函数 GUI_WrapGetNumLines()。 第 7 章 “2-D 图形库”: - 添加新函数 GUI_EnableAlpha()。 - 添加新函数 GUI_RestoreUserAlpha()。 - 添加新函数 GUI_SetUserAlpha()。 - 添加新函数 GUI_CreateBitmapFromStream()。 - 添加新函数 GUI_DrawStreamedBitmapEx()。 - 添加新函数 GUI_GetStreamedBitmapInfo()。 - 添加新函数 GUI_GetStreamedBitmapInfoEx()。 - 添加新函数 GUI_SetStreamedBitmapHook()。 - 添加新函数 GUI_CreateBitmapFromStreamIDX()。 - 添加新函数 GUI_CreateBitmapFromStreamRLE4()。 - 添加新函数 GUI_CreateBitmapFromStreamRLE8()。 - 添加新函数 GUI_CreateBitmapFromStream565()。 - 添加新函数 GUI_CreateBitmapFromStreamM565()。 - 添加新函数 GUI_CreateBitmapFromStream555()。 - 添加新函数 GUI_CreateBitmapFromStreamM555()。 - 添加新函数 GUI_CreateBitmapFromStreamRLE16()。 - 添加新函数 GUI_CreateBitmapFromStreamRLEM16()。 - 添加新函数 GUI_CreateBitmapFromStream24()。 - 添加新函数 GUI_CreateBitmapFromStreamAlpha()。 第 9 章 “字体”: - 添加新字体 F20F_ASCII (框架式)。 JE - 添加新字体 F6x8_ASCII 和 F6x8_1。 - 添加新字体 F8x8_ASCII 和 F8x8_1。 - 添加新字体 F8x16_ASCII 和 F8x16_1。 - 添加对扩展 AA2 和扩展 AA4 新字体格式的支持。 第 12 章 “存储设备”: - 添加对多图层 / 显示的考量。 第 14 章 “窗口管理器”: - WM_DeleteWindow() 现在还删除了所有相关定时器。 第 15 章 “小工具”: - 添加新函数 WINDOW_SetBkColor()。 第 19 章 “指针输入装置”: - 添加 PID 缓冲区。 - 修订对触摸校准的解释。 第 20 章 “键盘”: - 添加键盘缓冲区。 第 25 章 “显示驱动”: - 添加新驱动 GUIDRV_BitPlains。 - 添加新驱动 GUIDRV_SLin。 - 添加新驱动 GUIDRV_SSD1926。 - 添加驱动 GUIDRV_1611。 - 添加驱动 GUIDRV_6331。 - 添加驱动 GUIDRV_7529。 - 添加驱动 GUIDRV_Page1bpp。 - GUIDRV_CompactColor_16:添加对以下显示控制器的支持:奇景 HX8340 和 HX8352、所罗门 SSD1298、 SSD1355 和 SSD1963、爱普生 S1D19122、 Orisetech SPFD5414D、 Ilitek ILI9320 和 ILI9326 第 3 章 “模拟器”: JE - 全面修订。 第 8 章 “显示位图文件” - 添加 PNG 支持。 JE 软件已全面修订。有关各早期版本的修订历史记录,请参阅较早文档。 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 7 SEGGER Microcontroller GmbH & Co. KG 开发和经销 用于嵌入式系统的软件开发工具和 ANCI C 软件组件(中间件), 涉及电信、医疗技术、消费电子、汽车和工业自动化等多种行业。 SEGGER 的目标是通过提供小型灵活并易于使用的中间件,使 开发人员可以集中精力于具体应用,从而缩短嵌入式应用的 软件开发时间。 我们最受欢迎的产品有 emWin 和 embOS,前者是一款用 于嵌入式应用的通用图形软件包,后者是一种小型、高效的实时内核。emWin 完全采用 ANSI C 编写,可 轻松用于任何 CPU 和几乎所有显示器。以下 PC 工具是其的完美补充:位图转换器、字体转换器、模拟器 和查看器。 embOS 支持大多数 8/16/32 位 CPU。其存储器占用面积小,因此适于单芯片应用。 除了重点关注软件工具外, SEGGER 还研发和生产用于闪存宏控制器的编程工具,以及辅助研发、调试和 生产的 JTAG 仿真器 J-Link,它已迅速成为调试 ARM 内核存取的行业标准。 办公地址: http://www.segger.com 美国办事处: http://www.segger-us.com 嵌入式软件 (中间件) emWin 图形软件和 GUI emWin 设计用于提供高效且独立于处理器和 显示控制器的图形用户界面 (GUI),用于任何 使用图形显示进行操作的应用。我们提供有初 学者套装、评估版和试用版。 embOS 实时操作系统 embOS 是一种实时操作系统 (RTOS),设计用 于为复杂的实时应用提供占用资源最小的完整多 任务系统。其中包含仿形PC工具embOSView。 emFile 文件系统 emFile 是支持 FAT12、FAT16 和 FAT32 的嵌 入式文件系统。 emFile 已经过优化,可在保持 高速度的同时耗用最少的 RAM 和 ROM。可使 用各种不同的设备驱动,如 NAND 和 NOR 闪存 的驱动、 SD/MMC 和 CompactFlash 卡的驱 动。 USB 协议栈 USB 设备协议栈 USB 协议栈设计用于在任何使用 USB 客户端控 制器的嵌入式系统中工作。支持块通信和大多 数标准设备类别。 SEGGER 工具 Flasher 闪存编程器 主要用于微控制器的闪存编程工具。 J-Link ARM 内核的 JTAG 仿真器 用于 ARM 内核的 USB 驱动 JTAG 界面。 J-Trace 带跟踪的 JTAG 仿真器 用于 ARM 内核的 USB 驱动 JTAG 界面带跟踪存储器,支持 ARM ETM (嵌入式跟踪宏单元)。 J-Link / J-Trace 相关软件 与 SEGGER 盏男幸当曜糐 TAG 仿真器一同使用的附加软 件,包括闪存编程软件和闪存断点。 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 8 章节 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 9 目录 1 emWin 简介....................................................................................................................23 1.1 1.2 1.3 1.4 1.5 1.5.1 1.5.2 1.6 1.7 1.8 1.9 1.10 1.11 本文档的目的 ............................................................................................ 24 假定 ....................................................................................................... 24 如何使用本手册 ......................................................................................... 24 语法句子的印刷规范 .................................................................................... 24 要求 ....................................................................................................... 25 目标系统 (硬件)....................................................................................... 25 开发环境 (编译器).................................................................................... 25 特性 ....................................................................................................... 26 示例和演示 ............................................................................................... 27 初学者套装 ............................................................................................... 27 屏幕和坐标 ............................................................................................... 27 如何将显示器连接到微控制器 ......................................................................... 28 数据类型.................................................................................................. 29 2 入门指南.........................................................................................................................31 2.1 2.1.1 2.1.2 2.2 2.3 2.3.1 2.4 2.5 2.6 2.7 2.8 推荐目录结构 ............................................................................................ 32 子目录 .................................................................................................... 32 包含目录.................................................................................................. 32 添加 emWin 到目标程序............................................................................... 32 创建库 .................................................................................................... 33 改编库批处理文件以适应不同系统 ................................................................... 33 要包含在项目中的 C 文件 .............................................................................. 35 emWin 的配置 .......................................................................................... 35 初始化 emWin .......................................................................................... 36 有目标硬件时使用 emWin ............................................................................ 37 “Hello world”示例程序 ............................................................................. 37 3 模拟................................................................................................................................39 3.1 3.1.1 3.1.1.1 3.1.1.2 3.1.1.3 3.1.1.4 3.1.2 3.1.2.1 3.1.2.2 3.1.2.3 3.1.3 3.1.3.1 3.1.3.2 3.1.3.3 3.2 3.2.1 3.2.2 3.2.3 3.3 3.4 3.4.1 使用模拟.................................................................................................. 40 通过 emWin 试用版使用模拟 ......................................................................... 40 目录结构.................................................................................................. 40 Visual C++ 工作空间 ................................................................................. 40 编译演示程序 ............................................................................................ 41 编译示例.................................................................................................. 41 通过 emWin 源代码使用模拟 ......................................................................... 42 目录结构.................................................................................................. 42 Visual C++ 工作空间 ................................................................................. 42 编译应用程序 ............................................................................................ 43 模拟的高级功能 ......................................................................................... 43 暂停和恢复 ............................................................................................... 43 查看系统信息 ............................................................................................ 43 复制到剪贴板 ............................................................................................ 43 设备模拟.................................................................................................. 44 生成的框架视图 ......................................................................................... 45 自定义位图视图 ......................................................................................... 45 窗口视图.................................................................................................. 46 设备模拟 API ............................................................................................ 47 硬键模拟.................................................................................................. 52 硬键模拟 API ............................................................................................ 53 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 10 3.5 3.5.1 3.5.2 3.5.2.1 3.5.2.2 3.5.3 3.5.3.1 3.5.3.2 3.5.4 集成 emWin 模拟到现有模拟中 ...................................................................... 56 目录结构 ................................................................................................. 56 使用模拟库 .............................................................................................. 56 修改 WinMain .......................................................................................... 56 应用程序示例............................................................................................ 57 集成到 embOS 模拟中 ................................................................................ 58 WinMain................................................................................................. 58 目标程序 (main) ....................................................................................... 59 GUI 模拟 API ........................................................................................... 60 4 查看器 ............................................................................................................................63 4.1 4.1.1 4.1.2 4.1.3 4.1.4 4.1.5 4.1.6 4.1.7 4.1.8 使用查看器 .............................................................................................. 64 使用模拟和查看器 ...................................................................................... 64 使用带虚拟页面的查看器 .............................................................................. 65 总在顶部显示............................................................................................ 65 打开显示输出的更多窗口 .............................................................................. 65 缩放....................................................................................................... 66 将输出复制到剪贴板 ................................................................................... 66 使用带多种显示的查看器 .............................................................................. 67 使用带多种显示的查看器 .............................................................................. 67 5 显示文本.........................................................................................................................69 5.1 基本例程 ................................................................................................. 70 5.2 文本 API ................................................................................................. 71 5.3 显示文本的例程 ......................................................................................... 72 5.4 选择文本绘制模式 ...................................................................................... 79 5.5 选择文本对齐模式 ...................................................................................... 81 5.6 设置当前文本位置 ...................................................................................... 83 5.7 返回当前文本位置 ...................................................................................... 84 5.8 清除窗口或部分窗口的例程 ........................................................................... 84 6 显示数值.........................................................................................................................85 6.1 评估 API ................................................................................................. 86 6.2 显示十进制数值 ......................................................................................... 87 6.3 显示浮点数值............................................................................................ 91 6.4 显示二进制数值 ......................................................................................... 94 6.5 显示十六进制数值 ...................................................................................... 95 6.6 emWin 版 ............................................................................................... 96 7 2-D 图形库......................................................................................................................97 7.1 7.2 7.3 7.4 7.5 7.6 7.7 7.8 7.9 7.10 7.11 7.12 7.13 7.14 7.15 7.16 7.17 图形 API ................................................................................................. 98 绘制模式 ................................................................................................100 查询当前客户区矩形 ..................................................................................102 画笔大小 ................................................................................................102 基本绘制例程 ...........................................................................................103 Alpha 混合 .............................................................................................110 绘制位图 ................................................................................................113 绘制流位图 .............................................................................................116 绘制线条 ................................................................................................122 绘制多边形 .............................................................................................126 绘制圆 ...................................................................................................131 绘制椭圆 ................................................................................................133 绘制弧线 ................................................................................................135 绘制线图 ................................................................................................137 绘制饼图 ................................................................................................138 保存和恢复 GUI 环境 .................................................................................139 裁剪 ......................................................................................................140 8 显示位图文件 ...............................................................................................................141 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 11 8.1 8.1.1 8.1.2 8.2 8.2.1 8.2.2 8.2.3 8.2.4 8.2.5 8.2.6 8.3 8.3.1 8.3.2 8.3.3 8.3.4 8.4 8.4.1 8.4.2 8.4.3 8.4.4 8.5 BMP 文件支持 ......................................................................................... 142 支持的格式 ............................................................................................. 142 BMP 文件 API ......................................................................................... 142 JPEG 文件支持 ........................................................................................ 148 支持的 JPEG 压缩方法 ............................................................................... 148 将 JPEG 文件转换为 C 源 ............................................................................ 148 显示 JPEG 文件........................................................................................ 148 存储器使用 ............................................................................................. 149 渐进式 JPEG 文件..................................................................................... 149 JPEG 文件 API ........................................................................................ 149 GIF 文件支持 .......................................................................................... 154 将 GIF 文件转换为 C 源 .............................................................................. 154 显示 GIF 文件 ......................................................................................... 154 存储器使用 ............................................................................................. 154 GIF 文件 API .......................................................................................... 155 PNG 文件支持 ......................................................................................... 163 将 PNG 文件转换为 C 源 ............................................................................. 163 显示 PNG 文件 ........................................................................................ 163 存储器使用 ............................................................................................. 163 PNG 文件 API ......................................................................................... 163 使用 ...Ex() 函数获取数据 .......................................................................... 167 9 字体..............................................................................................................................169 9.1 9.2 9.3 9.3.1 9.3.2 9.3.3 9.3.4 9.4 9.5 9.6 9.7 9.8 9.9 9.10 9.11 9.12 9.13 9.13.1 9.13.2 9.13.3 9.14 9.14.1 9.15 9.15.1 9.15.2 9.15.3 9.15.4 9.15.4.1 9.15.4.2 9.15.4.3 9.15.5 9.15.5.1 9.15.5.2 9.15.5.3 9.15.6 9.15.6.1 9.15.6.2 9.15.6.3 简介 ..................................................................................................... 170 字体类型................................................................................................ 170 字体格式................................................................................................ 172 C 文件格式 ............................................................................................. 172 系统独立字体 (SIF) 格式 ............................................................................ 172 外部位图字体 (XBF) 格式 ........................................................................... 173 TrueType 字体 (TTF) 格式 ......................................................................... 174 将 TTF 文件转换为 C 源 .............................................................................. 174 声明自定义字体 ....................................................................................... 175 选择字体................................................................................................ 175 字体 API................................................................................................ 176 C 文件相关的字体函数 ............................................................................... 177 “SIF”文件相关的字体函数 ........................................................................ 178 “TTF”文件相关的字体函数 ........................................................................ 179 “XBF”文件相关的字体函数........................................................................ 183 常见字体相关的函数 .................................................................................. 184 字符集 .................................................................................................. 188 ASCII................................................................................................... 188 ISO 8859-1 西方拉丁字符集....................................................................... 189 Unicode................................................................................................ 190 字体转换器 ............................................................................................. 191 添加字体................................................................................................ 191 标准字体................................................................................................ 192 字体标识符命名约定 .................................................................................. 192 字体文件命名约定..................................................................................... 193 字体的计量、 ROM 大小和字符集 .................................................................. 193 比例字体................................................................................................ 194 概述 ..................................................................................................... 194 计量、 ROM 大小和使用的文件..................................................................... 194 字符 ..................................................................................................... 196 比例字体,带边框..................................................................................... 202 概述 ..................................................................................................... 202 计量、 ROM 大小和使用的文件..................................................................... 202 字符 ..................................................................................................... 202 等宽字体................................................................................................ 203 概述 ..................................................................................................... 203 计量、 ROM 大小和使用的文件..................................................................... 204 字符 ..................................................................................................... 205 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 12 9.15.7 9.15.7.1 9.15.7.2 9.15.7.3 9.15.8 9.15.8.1 9.15.8.2 9.15.8.3 数字字体 (比例).....................................................................................209 概述 ......................................................................................................209 计量、 ROM 大小和使用的文件 .....................................................................209 字符 ......................................................................................................209 数字字体 (等宽).....................................................................................210 概述 ......................................................................................................210 计量、 ROM 大小和使用的文件 .....................................................................211 字符 ......................................................................................................211 10 位图转换器 .................................................................................................................213 10.1 10.2 10.2.1 10.2.2 10.2.3 10.3 10.3.1 10.3.2 10.3.3 10.3.4 10.3.5 10.3.6 10.4 10.5 10.6 10.7 10.7.1 10.7.2 10.7.3 10.7.4 10.8 10.8.1 10.8.2 10.9 功能 ......................................................................................................214 加载位图 ................................................................................................214 支持的输入文件格式 ..................................................................................214 从文件加载 .............................................................................................214 使用剪贴板 .............................................................................................215 从位图生成 C 文件.....................................................................................215 支持的位图格式 ........................................................................................215 调色板信息 .............................................................................................215 透明性 ...................................................................................................216 Alpha 混合 .............................................................................................216 选择最佳格式 ...........................................................................................217 保存文件 ................................................................................................218 色彩转换 ................................................................................................219 生成 C 流文件 ..........................................................................................220 压缩位图 ................................................................................................220 使用定制调色板 ........................................................................................221 保存调色板文件 ........................................................................................221 C 文件格式..............................................................................................221 固定调色板模式的调色板文件 .......................................................................221 转换位图 ................................................................................................222 命令行用法 .............................................................................................222 命令的格式 .............................................................................................222 有效的命令行选项 .....................................................................................222 转换位图示例 ...........................................................................................224 11 颜色............................................................................................................................227 11.1 11.2 11.3 11.4 11.5 11.6 11.7 11.8 11.9 预定义的颜色 ...........................................................................................228 颜色条测试例程 ........................................................................................228 固定调色板模式 ........................................................................................229 固定调色板模式的详细说明 ..........................................................................230 应用程序定义的色彩转换 .............................................................................240 定制调色板模式 ........................................................................................241 颜色 API ................................................................................................241 基本颜色函数 ...........................................................................................242 索引和色彩转换 ........................................................................................244 12 存储设备.....................................................................................................................247 12.1 12.2 12.3 12.4 12.5 12.6 12.7 12.8 12.9 12.10 12.10.1 12.11 12.12 使用存储设备:图示 ..................................................................................248 支持的色彩深度 (bpp)................................................................................248 存储设备和窗口管理器 ................................................................................249 存储设备和多层 ........................................................................................249 内存要求 ................................................................................................249 性能 ......................................................................................................250 基本函数 ................................................................................................251 使用存储设备的准备操作 ... .........................................................................251 多层 / 多显示配置 .....................................................................................251 配置选项 ................................................................................................251 GUI_USE_MEMDEV_1BPP_FOR_SCREEN....................................................251 存储设备 API ...........................................................................................251 基本函数 ................................................................................................253 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 13 12.13 12.14 12.15 12.16 12.17 分段存储设备 .......................................................................................... 266 自动设备对象 .......................................................................................... 267 测量设备对象 .......................................................................................... 269 动画函数................................................................................................ 271 动画函数 (需要使用窗口管理器)................................................................. 272 13 执行模型:单任务 / 多任务.........................................................................................277 13.1 13.2 13.2.1 13.2.2 13.2.3 13.2.4 13.2.5 13.2.6 13.3 13.3.1 13.3.2 13.3.3 13.3.4 13.4 13.4.1 13.4.2 13.4.3 13.4.4 13.4.5 13.4.6 13.5 13.6 13.7 13.7.1 支持的执行模型 ....................................................................................... 278 单任务系统 (超循环)............................................................................... 278 描述 ..................................................................................................... 278 超循环示例 (无 emWin).......................................................................... 278 优势 ..................................................................................................... 278 缺点 ..................................................................................................... 278 使用 emWin ........................................................................................... 278 超循环示例 (有 emWin).......................................................................... 279 多任务系统:一个任务调用 emWin ............................................................... 279 描述 ..................................................................................................... 279 优势 ..................................................................................................... 279 缺点 ..................................................................................................... 279 使用 emWin ........................................................................................... 279 多任务系统:多个任务调用 emWin ............................................................... 280 描述 ..................................................................................................... 280 优势 ..................................................................................................... 280 缺点 ..................................................................................................... 280 使用 emWin ........................................................................................... 280 建议 ..................................................................................................... 280 示例 ..................................................................................................... 280 支持多任务的 GUI 配置函数 ........................................................................ 281 支持多任务的 GUI 配置宏 ........................................................................... 283 内核接口 API .......................................................................................... 284 示例 ..................................................................................................... 287 14 窗口管理器 (WM) .......................................................................................................289 14.1 14.2 14.2.1 14.2.2 14.2.3 14.2.4 14.2.5 14.2.6 14.2.7 14.2.8 14.3 14.3.1 14.3.2 14.3.3 14.3.4 14.3.5 14.3.6 14.4 14.5 14.5.1 14.6 14.7 14.8 14.9 14.10 术语说明................................................................................................ 290 回调机制,无效化和渲染 ............................................................................ 291 不使用回调渲染 ....................................................................................... 291 使用回调渲染 .......................................................................................... 292 背景窗口重绘和回调 .................................................................................. 292 无效化 .................................................................................................. 293 渲染透明窗口 .......................................................................................... 293 自动使用存储设备..................................................................................... 293 自动使用多帧缓冲..................................................................................... 294 自动使用显示驱动缓存 ............................................................................... 294 消息 ..................................................................................................... 295 消息结构................................................................................................ 295 消息清单................................................................................................ 295 系统定义的消息 ....................................................................................... 296 指针输入设备 (PID) 消息 ............................................................................ 300 系统定义的通知代码 .................................................................................. 303 应用定义的消息 ....................................................................................... 303 配置选项................................................................................................ 304 WM API ................................................................................................ 305 使用 WM API 函数.................................................................................... 307 基本函数................................................................................................ 307 存储设备支持 (可选)............................................................................... 336 定时器相关函数 ....................................................................................... 336 小工具相关函数 ....................................................................................... 339 示例 ..................................................................................................... 342 15 窗口对象 (小工具)...................................................................................................345 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 14 15.1 15.1.1 15.1.2 15.1.3 15.2 15.3 15.3.1 15.3.2 15.3.3 15.4 15.4.1 15.4.2 15.4.3 15.4.4 15.4.5 15.5 15.5.1 15.5.2 15.5.3 15.5.4 15.5.5 15.6 15.6.1 15.6.2 15.6.3 15.6.4 15.6.5 15.7 15.7.1 15.7.2 15.7.3 15.7.4 15.7.5 15.8 15.8.1 15.8.2 15.8.3 15.8.4 15.8.5 15.9 15.9.1 15.9.2 15.9.3 15.9.4 15.9.4.1 15.9.4.2 15.9.5 15.9.5.1 15.9.5.2 15.9.6 15.9.7 15.9.7.1 15.9.7.2 15.9.7.3 15.9.7.4 15.9.8 15.10 15.10.1 15.10.2 15.10.3 15.10.4 基础知识 ................................................................................................346 可用小工具 .............................................................................................346 了解重绘机制 ...........................................................................................347 如何使用小工具 ........................................................................................347 配置选项 ................................................................................................349 通用小工具 API ........................................................................................350 用于小工具的 WM 例程 ...............................................................................350 常用例程 ................................................................................................350 用户绘制小工具 ........................................................................................354 BUTTON:按钮小工具 ...............................................................................356 配置选项 ................................................................................................356 通知代码 ................................................................................................357 键盘反应 ................................................................................................357 BUTTON API ..........................................................................................357 示例 ......................................................................................................370 CHECKBOX:复选框小工具.........................................................................371 配置选项 ................................................................................................372 通知代码 ................................................................................................372 键盘反应 ................................................................................................372 CHECKBOX API ......................................................................................372 示例 ......................................................................................................386 DROPDOWN:下拉列表小工具 ....................................................................387 配置选项 ................................................................................................388 通知代码 ................................................................................................388 键盘反应 ................................................................................................388 DROPDOWN API.....................................................................................388 示例 ......................................................................................................400 EDIT:“编辑”小工具 ...............................................................................402 配置选项 ................................................................................................402 通知代码 ................................................................................................402 键盘反应 ................................................................................................403 EDIT API ...............................................................................................403 示例 ......................................................................................................418 FRAMEWIN:框架窗口小工具 ......................................................................419 框架窗口的结构 ........................................................................................420 配置选项 ................................................................................................421 键盘反应 ................................................................................................421 FRAMEWIN API ......................................................................................421 示例 ......................................................................................................442 GRAPH:图形小工具 .................................................................................443 图形小工具的结构 .....................................................................................443 创建和删除图形小工具 ................................................................................444 绘制过程 ................................................................................................444 支持的曲线类型 ........................................................................................444 GRAPH_DATA_XY ...................................................................................445 GRAPH_DATA_YT ...................................................................................445 配置选项 ................................................................................................445 图形小工具 .............................................................................................445 刻度对象 ................................................................................................445 键盘反应 ................................................................................................445 图形 API ................................................................................................445 常用例程 ................................................................................................447 GRAPH_DATA_YT 相关的例程.....................................................................455 GRAPH_DATA_XY 相关的例程.....................................................................459 刻度相关的例程 ........................................................................................463 示例 ......................................................................................................467 HEADER:标题小工具 ...............................................................................469 配置选项 ................................................................................................470 通知代码 ................................................................................................470 键盘反应 ................................................................................................470 HEADER API ..........................................................................................470 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 15 15.10.5 15.11 15.11.1 15.11.2 15.11.3 15.11.4 15.11.5 15.12 15.12.1 15.12.2 15.12.3 15.12.4 15.12.5 15.13 15.13.1 15.13.2 15.13.3 15.13.4 15.13.5 15.14 15.14.1 15.14.2 15.14.3 15.14.4 15.15 15.15.1 15.15.2 15.15.3 15.15.4 15.15.5 15.15.6 15.16 15.16.1 15.16.2 15.16.3 15.17 15.17.1 15.17.2 15.17.3 15.17.4 15.17.5 15.18 15.18.1 15.18.2 15.18.3 15.18.4 15.18.5 15.19 15.19.1 15.19.2 15.19.3 15.19.4 15.20 15.20.1 15.20.2 15.20.3 15.20.4 15.20.5 15.21 15.21.1 15.21.2 示例 ..................................................................................................... 482 ICONVIEW:图标视图小工具 ...................................................................... 483 配置选项................................................................................................ 483 通知代码................................................................................................ 484 键盘反应................................................................................................ 484 ICONVIEW API ...................................................................................... 484 示例 ..................................................................................................... 494 LISTBOX:列表框小工具 ........................................................................... 496 配置选项................................................................................................ 496 通知代码................................................................................................ 496 键盘反应................................................................................................ 496 LISTBOX API ......................................................................................... 497 示例 ..................................................................................................... 513 LISTVIEW:Listview 小工具 ...................................................................... 514 配置选项................................................................................................ 515 通知代码................................................................................................ 515 键盘反应................................................................................................ 515 LISTVIEW API ....................................................................................... 516 示例 ..................................................................................................... 537 LISTWHEEL:Listwheel 小工具 .................................................................. 539 配置选项................................................................................................ 539 通知代码................................................................................................ 539 键盘反应................................................................................................ 539 LISTWHEEL API ..................................................................................... 540 MENU:菜单小工具 .................................................................................. 553 菜单消息................................................................................................ 554 数据结构................................................................................................ 555 配置选项................................................................................................ 555 键盘反应................................................................................................ 556 “菜单” API ........................................................................................... 556 示例 ..................................................................................................... 570 MESSAGEBOX:消息框小工具 .................................................................... 571 配置选项................................................................................................ 571 键盘反应................................................................................................ 571 MESSAGEBOX API.................................................................................. 571 MULTIEDIT:多行文本小工具 ..................................................................... 573 配置选项................................................................................................ 574 通知代码................................................................................................ 574 键盘反应................................................................................................ 574 MULTIEDIT API...................................................................................... 574 示例 ..................................................................................................... 584 MULTIPAGE:“多页”小工具 ..................................................................... 586 配置选项................................................................................................ 587 通知代码................................................................................................ 587 键盘反应................................................................................................ 587 MULTIPAGE API ..................................................................................... 587 示例 ..................................................................................................... 598 PROGBAR:进度条小工具 .......................................................................... 599 配置选项................................................................................................ 599 键盘反应................................................................................................ 599 PROGBAR API ....................................................................................... 599 示例 ..................................................................................................... 604 RADIO:单选按钮小工具 ........................................................................... 605 配置选项................................................................................................ 605 通知代码................................................................................................ 605 键盘反应................................................................................................ 606 RADIO API............................................................................................ 606 示例 ..................................................................................................... 615 SCROLLBAR:滚动条小工具 ....................................................................... 617 配置选项................................................................................................ 617 通知代码................................................................................................ 617 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 16 15.21.3 键盘反应 ................................................................................................617 15.21.4 SCROLLBAR API .....................................................................................618 15.21.5 示例......................................................................................................625 15.22 SLIDER:滑块小工具 ................................................................................626 15.22.1 配置选项 ................................................................................................626 15.22.2 通知代码 ................................................................................................626 15.22.3 键盘反应 ................................................................................................626 15.22.4 SLIDER API ...........................................................................................626 15.22.5 15.23 15.23.1 15.23.2 15.23.3 15.23.4 示例 ......................................................................................................632 文本文本小工具 ........................................................................................633 配置选项 ................................................................................................633 键盘反应 ................................................................................................633 文本 API ................................................................................................633 示例 ......................................................................................................639 15.24 TREEVIEW:树形视图小工具.......................................................................640 15.24.1 术语说明 ................................................................................................641 15.24.2 配置选项 ................................................................................................642 15.24.3 通知代码 ................................................................................................642 15.24.4 键盘反应 ................................................................................................642 15.24.5 TREEVIEW API .......................................................................................643 15.24.5.1 常用例程 ................................................................................................644 15.24.5.2 项目相关例程...........................................................................................657 15.24.6 示例......................................................................................................662 15.25 WINDOW:窗口小工具 ..............................................................................663 15.25.1 配置选项 ................................................................................................663 15.25.2 键盘反应 ................................................................................................663 15.25.3 WINDOW API.........................................................................................663 16 对话框 ........................................................................................................................665 16.1 16.2 16.2.1 16.2.2 16.2.2.1 16.2.2.2 16.3 16.4 对话框的基本原理 .....................................................................................666 创建对话框 .............................................................................................666 资源表 ...................................................................................................666 对话框过程函数 ........................................................................................667 初始化对话框 ...........................................................................................668 定义对话框行为 ........................................................................................669 对话框 API..............................................................................................670 对话框 ...................................................................................................670 17 GUIBuilder .................................................................................................................673 17.1 17.2 17.3 17.3.1 17.3.2 17.3.3 17.3.4 17.3.5 17.3.6 17.4 17.5 17.6 17.7 简介 ......................................................................................................674 入门指南 ................................................................................................675 创建对话框 .............................................................................................676 选择父小工具 ...........................................................................................676 在编辑器中调整大小和定位 ..........................................................................676 修改小工具属性 ........................................................................................676 向小工具添加其他函数 ................................................................................676 删除小工具属性 ........................................................................................677 删除小工具 .............................................................................................677 保存当前的对话框 .....................................................................................678 GUIBuilder 的输出 ...................................................................................679 修改 C 文件 .............................................................................................681 如何使用 C 文件 .......................................................................................681 18 换肤............................................................................................................................683 18.1 18.2 18.3 18.4 18.4.1 18.4.2 “皮肤”是什么? ......................................................................................684 从使用 API 函数到换肤 ...............................................................................684 可换肤的小工具 ........................................................................................685 使用皮肤 ................................................................................................685 运行时间配置 ...........................................................................................686 编译时间配置 ...........................................................................................686 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 17 18.5 18.6 18.6.1 18.6.2 18.6.3 18.7 18.8 18.8.1 18.8.2 18.8.3 18.8.4 18.9 18.9.1 18.9.2 18.9.3 18.9.4 18.10 18.10.1 18.10.2 18.10.3 18.10.4 18.11 18.11.1 18.11.2 18.11.3 18.11.4 18.12 18.12.1 18.12.2 18.12.3 18.12.4 18.13 18.13.1 18.13.2 18.13.3 18.13.4 18.14 18.14.1 18.14.2 18.14.3 18.14.4 18.15 18.15.1 18.15.2 18.15.3 18.15.4 18.16 18.16.1 18.16.2 18.16.3 18.16.4 简单更改 “Flex”皮肤外观 ......................................................................... 686 对 “Flex”皮肤外观所作的重大更改 .............................................................. 687 换肤回调机制 .......................................................................................... 687 更改默认皮肤的外观 .................................................................................. 687 命令列表................................................................................................ 688 常用的换肤 API........................................................................................ 690 BUTTON_SKIN_FLEX .............................................................................. 693 配置结构................................................................................................ 693 配置选项................................................................................................ 693 换肤 API................................................................................................ 694 命令列表................................................................................................ 695 CHECKBOX_SKIN_FLEX .......................................................................... 696 配置结构................................................................................................ 696 配置选项................................................................................................ 696 换肤 API................................................................................................ 697 命令列表................................................................................................ 698 DROPDOWN_SKIN_FLEX......................................................................... 700 配置结构................................................................................................ 700 配置选项................................................................................................ 701 换肤 API................................................................................................ 701 命令列表................................................................................................ 702 FRAMEWIN_SKIN_FLEX .......................................................................... 703 配置结构................................................................................................ 703 配置选项................................................................................................ 704 换肤 API................................................................................................ 704 命令列表................................................................................................ 705 HEADER_SKIN_FLEX .............................................................................. 708 配置结构................................................................................................ 708 配置选项................................................................................................ 708 换肤 API................................................................................................ 709 命令列表................................................................................................ 709 PROGBAR_SKIN_FLEX ............................................................................ 711 配置结构................................................................................................ 711 配置选项................................................................................................ 711 换肤 API................................................................................................ 712 命令列表................................................................................................ 712 RADIO_SKIN_FLEX ................................................................................ 715 配置结构................................................................................................ 715 配置选项................................................................................................ 716 换肤 API................................................................................................ 716 命令列表................................................................................................ 717 SCROLLBAR_SKIN_FLEX ......................................................................... 719 配置结构................................................................................................ 719 配置选项................................................................................................ 720 换肤 API................................................................................................ 720 命令列表................................................................................................ 721 SLIDER_SKIN_FLEX ............................................................................... 724 配置结构................................................................................................ 724 配置选项................................................................................................ 725 换肤 API................................................................................................ 725 命令列表................................................................................................ 726 19 多缓冲 ........................................................................................................................729 19.1 19.1.1 19.1.2 19.2 19.3 19.4 19.4.1 19.4.2 工作原理................................................................................................ 730 双缓冲 .................................................................................................. 730 三缓冲 .................................................................................................. 730 要求 ..................................................................................................... 731 限制 ..................................................................................................... 731 配置 ..................................................................................................... 731 LCD_X_Config() .................................................................................... 731 LCD_X_DisplayDriver()........................................................................... 732 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 18 19.5 19.6 通过窗口管理器自动使用多个缓冲器 ...............................................................733 多缓冲 API..............................................................................................734 20 虚拟屏幕 / 虚拟页面 ...................................................................................................739 20.1 20.2 20.3 20.4 20.4.1 20.4.2 20.4.3 20.5 简介 ......................................................................................................740 要求 ......................................................................................................740 配置 ......................................................................................................741 示例 .....................................................................................................741 基本示例 ................................................................................................741 使用窗口管理器的实时示例 ..........................................................................743 使用窗口管理器的对话框示例 .......................................................................744 虚拟屏幕 API ...........................................................................................746 21 多层 / 多显示支持 .......................................................................................................747 21.1 21.1.1 21.1.2 21.1.2.1 21.2 21.2.1 21.2.2 21.2.3 21.2.4 21.3 21.3.1 21.3.2 21.3.3 21.4 21.5 21.6 简介 ......................................................................................................748 选择绘图操作所使用的层 .............................................................................748 选择窗口所使用的层 ..................................................................................748 把窗口从一层移到另一层 .............................................................................749 使用多层支持 ...........................................................................................751 透明 ......................................................................................................751 Alpha 混合 .............................................................................................752 硬件游标 ................................................................................................753 多层示例 ................................................................................................753 使用多显示支持 ........................................................................................753 启用多显示支持 ........................................................................................753 运行时间屏幕旋转 .....................................................................................754 多显示示例 .............................................................................................754 配置多层支持 ...........................................................................................754 配置多显示支持 ........................................................................................755 多层 API ................................................................................................755 22 指针输入设备 .............................................................................................................759 22.1 22.2 22.3 22.3.1 22.3.2 22.3.2.1 22.3.2.2 22.4 22.4.1 22.4.2 22.4.2.1 22.4.2.2 22.4.2.3 22.4.2.4 22.4.2.5 22.5 描述 ......................................................................................................760 指针输入设备 API .....................................................................................760 鼠标驱动 ................................................................................................761 通用鼠标 API ...........................................................................................761 PS2 鼠标驱动 ..........................................................................................762 使用 PS2 鼠标驱动 ....................................................................................762 PS2 鼠标驱动 ..........................................................................................762 触摸屏驱动 .............................................................................................763 通用型触摸屏 API .....................................................................................763 模拟触摸屏驱动 ........................................................................................764 设置模拟触摸屏 ........................................................................................765 运行时校准 .............................................................................................767 硬件程序 ................................................................................................767 模拟触摸屏的驱动 API ................................................................................769 配置模拟触摸屏驱动 ..................................................................................770 游戏操纵杆输入示例 ..................................................................................771 23 键盘输入.....................................................................................................................773 23.1 23.1.1 23.1.2 描述 ......................................................................................................774 驱动层 API..............................................................................................775 应用层 API..............................................................................................776 24 Sprites........................................................................................................................777 24.1 24.2 简介 ......................................................................................................778 Sprite API .............................................................................................778 25 游标............................................................................................................................783 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 19 25.1 25.2 可用游标................................................................................................ 784 游标 API................................................................................................ 784 26 抗锯齿 ........................................................................................................................787 26.1 26.1.1 26.1.2 26.1.3 26.2 26.3 26.4 26.5 简介 ..................................................................................................... 788 抗锯齿质量 ............................................................................................. 788 无锯齿字体 ............................................................................................. 788 高分辨率坐标 .......................................................................................... 789 抗锯齿 API ............................................................................................. 790 控制函数................................................................................................ 790 绘图函数................................................................................................ 791 示例 ..................................................................................................... 795 27 外语支持.....................................................................................................................801 27.1 27.1.1 27.1.2 27.1.3 27.1.3.1 27.1.4 27.1.4.1 27.1.4.2 27.2 27.2.1 27.2.2 27.2.3 27.2.4 27.2.5 27.2.6 27.2.7 27.3 27.3.1 27.3.2 27.3.3 27.3.4 27.4 27.4.1 Unicode................................................................................................ 802 UTF-8 编码方案....................................................................................... 802 Unicode 字符.......................................................................................... 802 UTF-8 字符串 ......................................................................................... 803 使用 U2C.exe 将 UTF-8 文本转换为 C 编码 ..................................................... 803 Unicode API .......................................................................................... 804 UTF-8 函数 ............................................................................................ 804 双字节函数 ............................................................................................. 807 阿拉伯语支持 .......................................................................................... 808 记号形式................................................................................................ 808 合体字符................................................................................................ 809 双向文本对齐 .......................................................................................... 809 要求 ..................................................................................................... 810 如何启用阿拉伯语支持 ............................................................................... 810 示例 ..................................................................................................... 810 配合阿拉伯语文本使用的字体文件 ................................................................. 810 泰语支持................................................................................................ 811 要求 ..................................................................................................... 811 如何启用泰语支持..................................................................................... 811 示例 ..................................................................................................... 811 配合泰语文本使用的字体文件 ....................................................................... 811 Shift JIS 支持 ......................................................................................... 812 创建 Shift JIS 字体................................................................................... 812 28 显示驱动.....................................................................................................................813 28.1 28.1.1 28.1.2 28.1.3 28.1.4 28.1.5 28.2 28.2.1 28.2.2 28.2.2.1 28.2.3 28.2.3.1 28.2.4 28.2.4.1 28.2.5 28.2.5.1 28.3 28.3.1 28.3.2 28.3.2.1 28.3.2.2 现有显示驱动 .......................................................................................... 814 驱动文件命名规则..................................................................................... 814 运行时间可配置驱动 .................................................................................. 814 编译时可配置驱动..................................................................................... 815 尚未移植的现有驱动 .................................................................................. 816 特殊用途驱动 .......................................................................................... 816 CPU / 显示控制器接口 ............................................................................... 816 直接接口................................................................................................ 817 间接接口 —— 并行总线 .............................................................................. 817 I/O 引脚连接程序示例 ............................................................................... 818 间接接口 ——4 引脚 SPI ............................................................................ 818 I/O 引脚连接程序示例 ............................................................................... 818 间接接口 ——3 引脚 SPI ............................................................................ 818 I/O 引脚连接程序示例 ............................................................................... 819 间接接口 ——I2C 总线 .............................................................................. 819 I/O 引脚连接程序示例 ............................................................................... 819 硬件接口配置 .......................................................................................... 819 直接接口................................................................................................ 819 间接接口................................................................................................ 819 运行时间配置 .......................................................................................... 820 编译时间配置 .......................................................................................... 821 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 20 28.4 28.5 28.5.1 28.5.1.1 28.5.1.2 28.5.2 28.6 28.6.1 28.7 28.7.1 28.7.2 28.7.3 28.7.4 28.7.5 28.7.6 28.7.7 28.7.8 28.7.9 28.7.10 28.7.11 28.7.12 28.7.13 28.7.14 28.7.15 28.7.16 28.7.17 28.7.18 28.8 28.8.1 28.8.2 28.8.3 28.8.3.1 28.8.3.2 28.8.3.3 不可读取的显示器 .....................................................................................824 显示方向 ................................................................................................824 通过驱动配置显示方向 ................................................................................824 运行时间配置 ...........................................................................................825 编译时间配置 ...........................................................................................825 通过函数配置显示方向 ................................................................................825 显示驱动回调函数 .....................................................................................827 传给回调函数的命令 ..................................................................................827 显示驱动详细描述 .....................................................................................829 GUIDRV_BitPlains...................................................................................829 GUIDRV_Dist .........................................................................................832 GUIDRV_FlexColor..................................................................................834 GUIDRV_IST3088...................................................................................839 GUIDRV_Lin ..........................................................................................841 GUIDRV_S1D13748 ................................................................................845 GUIDRV_S1D15G00 ...............................................................................847 GUIDRV_SLin ........................................................................................850 GUIDRV_SPage ......................................................................................854 GUIDRV_SSD1926 .................................................................................858 GUIDRV_CompactColor_16 ......................................................................861 GUIDRV_Fujitsu_16 ................................................................................866 GUIDRV_Page1bpp .................................................................................868 GUIDRV_07X1 .......................................................................................871 GUIDRV_1611 .......................................................................................874 GUIDRV_6331 .......................................................................................877 GUIDRV_7529 .......................................................................................879 GUIDRV_Template—— 新驱动模板..............................................................882 LCD 层和显示驱动 API ...............................................................................883 显示驱动 API ...........................................................................................883 用户自定义程序 ........................................................................................884 LCD 层程序.............................................................................................885 "Get" 组 ................................................................................................885 配置组 ...................................................................................................888 缓存组 ...................................................................................................891 29 VNC 服务器................................................................................................................893 29.1 29.1.1 29.1.2 29.2 29.2.1 29.3 29.3.1 29.3.2 29.3.3 29.4 29.5 29.6 简介 ......................................................................................................894 要求 ......................................................................................................894 实现说明 ................................................................................................894 VNC 查看器 ............................................................................................895 启动 VNC 查看器 ......................................................................................895 emWinVNC 服务器 ...................................................................................896 启动 emWin VNC 服务器 ............................................................................896 服务器的启动方式 .....................................................................................896 VNC 服务器在目标系统上的集成....................................................................896 要求 ......................................................................................................897 配置选项 ................................................................................................897 VNC API................................................................................................897 30 与时间和执行相关的函数 ...........................................................................................901 30.1 时间和执行 API ........................................................................................902 31 配置............................................................................................................................905 31.1 31.2 31.3 31.4 31.4.1 31.4.1.1 31.4.2 需要配置的项目 ........................................................................................906 运行时间和编译时间的配置 ..........................................................................906 emWin 的初始化程序.................................................................................906 运行时间配置 ...........................................................................................907 定制 GUIConf.c .......................................................................................907 用于 GUI_X_Config() 的 API 函数 ................................................................907 定制 LCDConf.c.......................................................................................909 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 21 31.4.2.1 31.4.3 31.4.3.1 31.4.3.2 31.4.3.3 31.5 31.5.1 31.5.1.1 31.5.1.2 31.5.1.3 31.5.2 31.6 用于 LCD_X_Config() 的 API 函数 ............................................................... 910 定制 GUI_X.c ......................................................................................... 911 时间程序................................................................................................ 911 调试程序................................................................................................ 912 内核接口例程 .......................................................................................... 912 编译时间配置 .......................................................................................... 913 定制 GUIConf.h ...................................................................................... 913 配置 emWin 的可用功能............................................................................. 913 默认字体和默认颜色配置 ............................................................................ 913 高级 GUI 配置选项 ................................................................................... 914 定制 LCDConf.h ...................................................................................... 915 请求可用存储器 ....................................................................................... 915 32 性能与资源占用..........................................................................................................917 32.1 32.1.1 32.1.2 32.2 32.2.1 32.2.2 32.3 性能 ..................................................................................................... 918 驱动基准................................................................................................ 918 绘图性能................................................................................................ 919 存储器要求 ............................................................................................. 920 GUI 元件的存储器要求............................................................................... 920 堆栈要求................................................................................................ 921 示例应用的存储器要求 ............................................................................... 921 33 支持............................................................................................................................923 33.1 33.1.1 33.1.2 33.1.3 33.1.4 33.2 33.3 33.4 33.5 33.6 工具链 (编译器、链接器)的问题................................................................. 924 编译器故障 ............................................................................................. 924 编译器警告 ............................................................................................. 924 编译器错误 ............................................................................................. 924 链接器问题 ............................................................................................. 925 硬件 / 驱动问题........................................................................................ 925 API 函数的问题........................................................................................ 926 性能问题................................................................................................ 926 联系支持................................................................................................ 927 常见问题解答 .......................................................................................... 928 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 22 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 23 第1章 emWin 简介 本章将介绍与本文档相关的一些信息,也将概述 emWin 的构成特点及其要求。 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 24 章节 emWin 简介 1.1 本文档的目的 本指南介绍如何安装、配置和使用用于嵌入式应用程序的 emWin 图形用户界面,还将说明软件的内 部结构。 1.2 假定 本指南假定您已经具备 C 程序设计语言的基础知识。如果认为自己的 C 程序设计语言知识不够,建议 您阅读 Kernighan 和 Richie 编写的 "C" Programming Language (C 程序设计语言),该书介 绍了编程标准,在其较新版本还包括了 ANSI C 标准。无需汇编编程的知识。 1.3 如何使用本手册 本手册介绍如何安装、配置和使用 emWin。手册说明了软件的内部结构和 emWin 提供的所有功能 (应用程序接口或 API)。在实际使用 emWin 前,应阅读或至少浏览一遍本手册以便对软件有所了 解。然后建议按以下步骤进行操作: • 将 emWin 文件复制到计算机中。 • 通读 “入门指南”(第 31 页)。 • 使用模拟器以便更熟悉软件的功能 (请参阅 “模拟”(第 39 页))。 • 参考手册的其它内容,对程序进行扩展。 1.4 语法句子的印刷规范 本手册使用以下印刷规范: 样式 正文 关键字 参数 示例 新示例 警告 用途 正文文字。 在命令提示符后输入的或在显示屏上显示的文字 (即系统函数、文件或路径名)。 API 函数中的参数。 示例程序中的示例代码。 要添加到现有示例程序中的示例代码。 重要的警告或提醒。 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 25 1.5 要求 用 emWin 开发软件时无需目标系统;大多数软件都可使用模拟器进行开发。当然,最终目的通常是 能在目标系统上运行软件。 1.5.1 目标系统 (硬件) 目标系统必须具有: • 一个 CPU (8/16/32/64 位) • 一个具有最小内存的 RAM 和 ROM • 一个完整图形显示器 (任何类型和任何分辨率) 存储器要求取决于使用的是软件的哪部分以及目标编译器的效率。因此不可能指定精确的值,但是以 下值适用于典型的系统。 小系统 (无窗口管理器) • RAM:100 字节 • 堆栈:600 字节 • ROM:10-25 kb (取决于所使用的功能) 大系统 (包含窗口管理器和小工具) • RAM:2-6 kb (取决于所需的窗口数) • 堆栈:1200-1800 字节 (取决于所使用的功能) • ROM:30-60 kb (取决于所使用的功能) 请注意,如果应用程序使用了很多字体,则对 ROM 的要求会提高。上述所有值都是粗略估算值,不 保证能正常使用。 1.5.2 开发环境 (编译器) 所使用的 CPU 不重要;只需要一个至少满足以下国际标准之一的、符合 ANSI 标准的 C 语言编译器: • ISO/IEC/ANSI 9899:1990 (C90),支持 C++ 样式注释 (//) • ISO/IEC 9899:1999 (C99) • ISO/IEC 14882:1998 (C++) 如果您的编译器有某些限制,请告诉我们,我们将告诉您这些限制是否会在编译软件时导致问题。据 我们所知,任何 16/32/64 位 CPU 或 DSP 的编译器都可使用;大多数 8 位编译器也可使用。无需 C++ 编译器,但是可以使用。需要时,应用程序当然也可用 C++ 进行编程。 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 26 章节 emWin 简介 1.6 特性 emWin 设计用于提供高效且独立于处理器和显示控制器的图形用户界面,用于任何使用图形显示进 行操作的应用。它与单任务和多任务环境、专用操作系统或具有任何商业 RTOS 兼容, emWin 的发 货形式为 C 语言源代码。它可适用于任何尺寸的、具有任何显示控制器和 CPU 的物理和虚拟显示器。 其特性包括: 一般特性 • 支持使用任何控制器的任何 (单色、灰度或彩色)显示器 (如果有正确的驱动)。 • 在较小显示器上无显示控制器也可运行。 • 使用配置宏可支持任何接口。 • 显示尺寸可配置。 • 可在显示器上的任何点 (而不仅仅是在偶数位字节地址)上写入字符和位图。 • 已针对尺寸和速度优化了各种例程。 • 利用编译时间切换可进行不同优化。 • 对于较慢的显示控制器,可在存储器中缓存显示,将存取操作减到最少,从而获得非常高的速度。 • 结构清晰。 • 支持虚拟显示;虚拟显示可大于实际显示。 图形库 • 支持不同色深的位图。 • 可使用位图转换器。 • 绝对无浮点使用。 • 快速线 / 点绘制 (不使用浮点)。 • 圆形 / 多边形绘制非常快速。 • 不同的绘图模式。 字体 • 基本软件配备多种不同的字体:4*6、6*8、6*9、8*8、8*9、8*16、8*17、8*18、24*32 以及像素高度为 8、 10、 13、 16 的比例字体。有关详细信息,请参阅字体一章。 • 可以定义新的字体并只需简单链接。 • 只有应用程序使用的字体才实际链接到生成的可执行程序,从而使 ROM 使用最小。 • 字体可分别在 X 和 Y 方向完全缩放。 • 可使用字体转换器;主机系统 (即 Microsoft Windows)上有的任何字体都可以转换。 字符串 / 值输出例程 • 例程可以十进制、二进制、十六进制、任何字体形式显示值。 • 例程可以十进制、二进制、十六进制、任何字体形式编辑值。 窗口管理器 (WM) • 完整的窗口管理操作,包括裁剪。窗口的客户区以外的区域不可能被覆盖。 • 窗口可以移动和调整大小。 • 支持回调例程 (可选择是否使用)。 • WM 使用最小的 RAM (每个窗口大约 50 字节)。 PC 界面外观的可选小工具 • 提供各种小工具 (窗口对象,也称为控件)。它们通常自动操作并且简单易用。 支持触摸屏和鼠标 • 对于按钮小工具等窗口对象, emWin 提供触摸屏和鼠标支持。 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 27 PC 工具 • 模拟脉冲查看器。 • 位图转换器。 • 字体转换器。 1.7 示例和演示 为了让您更好地了解 emWin 的功能,我们准备了各种不同演示,其形式为 “即时可用”的模拟可执 行程序,在 Sample\EXE 下。示例程序的源代码位于 Sample 文件夹中。文件夹 Sample\GUIDemo 包含一个显示 emWin 许多特性的应用程序。所有示例也可从 www.segger.com 获得。 1.8 初学者套装 完整的初学者套装包括一个带显示器的演示电路板、一个 C 编译器和一个示例项目。有关详细信息, 请查看网站 www.segger.com。 1.9 屏幕和坐标 (0,0) X 屏幕由许多可以单独控制的点组成,这些点称为像 素。emWin 在其 API 中提供给用户程序的绝大部分 文本和绘图功能,都可在任何指定的像素上进行书 写或绘制。 水平尺度称为 X 轴,而垂直尺度称为 Y 轴。坐标定 义为一对由 X 和 Y 值组成的值 (X, Y)。在需要 X 和 Y 坐标的例程中 X 坐标始终在前。显示屏(或窗口) 左上角的坐标默认为 (0,0)。正的 X 值始终向右,正 的 Y 值始终向下。上图说明了坐标系以及 X 和 Y 轴 的方向。传递给 API 函数的所有坐标始终以像素为 单位指定。 Y emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 28 章节 emWin 简介 1.10 如何将显示器连接到微控制器 emWin 处理对显示器的所有访问。事实上可支持任何显示控制器,而与其访问方式无关。有关详细 信息,请参阅 “配置”(第 905 页)。如果不支持您的显示控制器,请与我们联系。我们当前正为市 场上的所有显示控制器编写驱动,可能已经具有您要使用的显示控制器的成熟驱动。通常可非常简单 地将访问显示器的例程(或宏)写入应用程序。SEGGER Microcontroller GmbH & Co. KG 可为 您提供这些定制服务,如果需要,还可为您的目标硬件提供定制服务。 显示器如何与系统连接无关紧要,只要软件可通过某种方式对其进行访问,这有多种不同的方式。这 些接口中的大多数通过以源代码形式提供的驱动支持。此类驱动通常不需要修改,而是通过在文件 LCDConf.h 中进行更改以便根据硬件进行配置。在 “显示驱动”(第 813 页)一章中给出了如何在 必要时为硬件定制驱动的详细信息。访问显示器最通用的方式如下所述。如果您只想了解如何使用 emWin,则可跳过本节。 带存储器映射显示控制器的显示器 显示控制器直接与系统的数据总线连接,即意味着可像 RAM 一样访问控制器。这是一种访问显示控 制器的高效方式,一般都建议使用它。将显示器地址定义到段 LCDSEG,而且为了能够访问显示器, 只需告诉链接器 / 定位器如何定位此段即可。该位置必须与物理地址空间中的访问地址相同。可提供 用于此类型接口和不同显示控制器的驱动。 显示控制器连接到端口 / 缓冲器的显示器 对于在快速处理器上使用的较慢显示控制器,使用端口线可能是唯一的解决方案。这种访问显示器的 方法有一个缺点,比直接总线接口稍微慢些,但是缓存能最小化对显示器的访问,因此显示更新不会 显著减慢。所有需要做的事情就是定义例程或宏,设置或读取显示器所连接的硬件端口 / 缓冲器。此 类型接口也可由不同显示控制器的不同驱动支持。 专有解决方案:无显示控制器的显示器 也可连接没有显示控制器的显示器。在此情况下,显示数据通常由控制器通过 4 或 8 位移位寄存器直接 提供。这些专有硬件解决方案的优点是成本不高,但缺点是会用掉很多可用计算时间。时间可在 20% 到 100%之间,取决于 CPU。对于较慢的 CPU,这是完全不可能的。此类型接口不需要特定的显示驱 动,因为 emWin 只是将所有显示数据放入显示缓存中。用户必须自己编写硬件相关的部分,从而定期 将高速缓存中的数据传输到显示器。 将视频图像传输到显示器中的示例代码,以 C 语言和 M16C 和 M16C/80 的优化汇编程序两种形式 提供。 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 29 1.11 数据类型 由于 C 语言不提供在其他所有平台上都相同的固定长度的数据类型,因此大多数情况下, emWin 使 用自己的数据类型,如下表所示: 数据类型 I8 U8 I16 U16 I32 U32 I16P U16P 定义 带符号字符 不带符号字符 带符号的短数 不带符号的短数 带符号的长数 不带符号的长数 带符号的短数 不带符号的短数 带符号的 8 位值 不带符号的 8 位值 带符号的 16 位值 不带符号的 16 位值 带符号的 32 位值 不带符号的 32 位值 带符号的 16 (或更多)位值 不带符号的 16 (或更多)位值 描述 对于大多数 16/32 位控制器,这些设置都运行良好。但是,如果在程序的其他段有类似定义,则需 要更改或重新定位它们。建议位置是在文件 Global.h 中。 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 30 章节 emWin 简介 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 31 第2章 入门指南 下面一章概述了在您的目标系统上设置和配置 emWin 的基础步骤,其中还包括简单的程序示例。 后面章节中对大多数主题进行了更为详细的探讨,如果有不确定的地方请参阅以后部分。在您开始更 复杂的编程之前,您最有可能需要参考手册的其它部分。 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 32 章节 2.1 推荐目录结构 我们建议 emWin 与您的应用程序文件保持分开。较好的做法是将所有程序文 件 (包括头文件)都放在项目根目录的 GUI 子目录中。目录结构应类似右侧 图示。此做法的优点是可通过简单地替换 GUI\ directories,非常轻松地更新 emWin 版本。您的应用程序文件可存储在任何位置。 入门指南 2.1.1 子目录 下表显示所有 GUI 子目录的内容: 目录 Config GUI\AntiAlias GUI\ConvertMono GUI\ConvertColor GUI\Core GUI\Font GUI\DisplayDriver GUI\MemDev GUI\VNC GUI\Widget GUI\WM 配置文件 支持抗锯齿 * 用于灰度显示器的颜色转换例程 * 用于彩色显示器的颜色转换例程 * emWin core files 字体文件 显示驱动 存储设备支持 * VNC 支持 * 小工具库 * 窗口管理器 * 内容 (* = 可选) 2.1.2 包含目录 您应确保包含路径含有以下目录 (包含顺序不重要): • Config • GUI\Core • GUI\DisplayDriver • GUI\Widget (如果使用小工具库) • GUI\WM (如果使用窗口管理器) 警示:请始终确保每个文件只有唯一版本! 如果因包括了旧文件而具有了不同版本,则在更新到 emWin 新版本时通常会导致严重问题。如果将 emWin 保持在建议目录下 (且仅在这些目录下),则不会发生此类问题。当更新到较新版本时,您 应能够保留您的配置文件并使其处于未更改状态。处于安全考虑,我们建议在更新之前备份 (或至少 重命名) GUI\ directories。 2.2 添加 emWin 到目标程序 最基本的,您可以选择仅包括您在项目中要实际使用的源文件 (随后进行编译和链接),或者创建一 个库并链接库文件。如果您的工具链支持“智能”链接(仅链入所引用的模块,而非未引用的模块), 则根本不必创建库,因为只会链接需要的函数和数据结构。如果您的工具链不支持 “智能”链接,则 库非常有意义,因为否则会链接所有项目,使程序极其庞大。对于一些 CPU,我们提供了示例项目以 帮助您入门。 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 33 2.3 创建库 从源构建库的步骤非常简单。第一步是将批处理文件(位于 SampleExample\ Makelib 下)复制到您的根目录,然后进行所有必要的更改。总共有四个批 Makelib.bat 处理文件需要复制,如下表所述。主文件 Makelib.bat 对于所有系统都是 相同的,不需要任何更改。要从您的目标系统构建库,通常需要对其它三个 较小的文件稍作改动。最后,启动文件 Makelib.bat,创建库。批处理文 Prep.bat 件假定您的 GUI 和 Config 子目录是按建议设置的。 右侧流程图说明了创建库的步骤。Makelib.bat 文件首先调用 Prep.bat, 为工具链准备环境。然后为要包括在库中的每个文件调用 CC.bat。按照需 CC.bat 要的次数执行该操作。CC.bat 将每个目标文件添加到 lib.bat 将使用的列 表中。当要添加到库中的所有文件都已列出后,Makelib.bat 调用 lib.bat, No lib.bat 使用库管理程序将列出的目标文件放入实际库中。当然您还可以选择 另一种方式创建库。 不建议创建包含编译时间可配置显示驱动的 emWin 库。有关显示驱动的可 All files in library? 配置性的更多信息,请参见 “现有显示驱动”(第 814 页)。 Yes 文件 Makelib.bat Prep.bat CC.bat lib.bat 描述 lib.bat 主批处理文件。不需要任何修改。 由 Makelib.bat 调用,为要使用的工具链准备环境。 由 Makelib.bat 为要添加到库中的每个文件调用;创建一个这些目标文件的列表,随后将在下一步 中由 lib.bat 文件中的库管理程序使用。 由 Makelib.bat 调用,以将 CC.bat 列出的目标文件放入库中。 文件出厂时,假定 Microsoft 编译器安装在其默认位置。如果所有批处理文件都复制到根目录下(直 接在 GUI 之上)且未作任何更改,则将为 emWin 模拟生成模拟库。但为了创建目标库,有必要修改 Prep.bat、 CC.bat 和 lib.bat。 2.3.1 改编库批处理文件以适应不同系统 下面将通过 Mitsubishi M32C CPU 的改编示例显示如何改编文件。 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 34 章节 入门指南 改编 Prep.bat Prep.bat 在 Makelib.bat 开始时调用。如上所述,其工作是设置所用工具的环境变量并设置环境 变量 PATH,以便批处理文件无需指定绝对路径就可调用工具。假定编译器安装在文件夹 C:\MTOOL 中,文件 Prep.bat 类似如下: @ECHO OFF SET TOOLPATH=C:\MTOOL REM ****************************************************************** REM Set the variable PATH to be able to call the tools SET PATH=%TOOLPATH%\BIN;%TOOLPATH%\LIB308;%PATH% REM ****************************************************************** REM Set the tool internal used variables SET BIN308=%TOOLPATH%\BIN SET INC308=%TOOLPATH%\INC308 SET LIB308=%TOOLPATH%\LIB308 SET TMP308=%TOOLPATH%\TMP 改编 CC.bat CC.bat 的作用是编译传递的源文件并将目标文件的文件名添加到链接列表中。在启动 MakeLib.bat 时,它会创建与自身位置相关的如下子目录: 目录 Lib Temp\Output Temp\Source 内容 此文件夹应包含构建过程之后的库文件。 将包含所有的编译器输出和链接列表文件。将在构建过程后删除。 MakeLib.bat 使用此文件夹复制所有用于构建过程的源文件和头文件。将在构建过程后 删除。 目标文件应创建 (或移动)到 Temp\Output,这确保所有输出都在构建过程后删除。链接列表也应 位于 output 文件夹中。如下为 Mitsubishi 编译器的示例: @ECHO OFF GOTO START REM ****************************************************************** REM Explanation of the used compiler options: -silent : Suppresses the copyright message display at startup -M82 : Generates object code for M32C/80 Series (Remove this switch for M16C80 targets) -c : Creates a relocatable file (extension .r30) and ends processing -I : Specifies the directory containing the file(s) specified in #include -dir : Specifies the destination directory -OS : Maximum optimization of speed followed by ROM size -fFRAM : Changes the default attribute of RAM data to far -fETI : Performs operation after extending char-type data to the int type (Extended according to ANSI standards) :START REM ****************************************************************** REM Compile the passed source file with the Mitsubishi NC308 compiler NC308 -silent -M82 -c -IInc -dir Temp\Output -OS -fFRAM -fETI Temp\Source\%1.c REM ****************************************************************** REM Pause if any problem occurs IF ERRORLEVEL 1 PAUSE REM ****************************************************************** REM Add the file name of the object file to the link list ECHO Temp\Output\%1.R30>>Temp\Output\Lib.dat 改编 Lib.bat 所有源文件编译完后,将从 MakeLib.bat 调用 Lib.bat,其作用是使用 CC.bat 创建的链接列表 创建库文件。库文件的目标文件夹应是 MakeLib.bat 创建的 Lib 文件夹。以下为 Mitsubishi 库管 理程序的示例: emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 35 @ECHO OFF GOTO START REM ****************************************************************** REM Explanation of the used options: -C : Creates new library file @ : Specifies command file :START REM ****************************************************************** REM Create the first part of the linker command file ECHO -C Lib\GUI>Temp\Output\PARA.DAT REM ****************************************************************** REM Merge the first part with the link list to the linker command file COPY Temp\Output\PARA.DAT+Temp\Output\Lib.dat Temp\Output\LINK.DAT REM ****************************************************************** REM Call the Mitsubishi librarian LB308 @Temp\Output\LINK.DAT REM ****************************************************************** REM Pause if any problem occurs IF ERRORLEVEL 1 PAUSE 2.4 要包含在项目中的 C 文件 一般而言,需要包含 emWin 的内核 C 文件、显示驱动、要使用的所有字体文件以及连同 emWin 一 起定购的所有可选模块: • 文件夹 Config 中的所有 C 文件 • 文件夹 GUI\Core 中的所有 C 文件 • 要使用的字体 (位于 GUI\Font 中) • 显示驱动:文件夹 GUI\DisplayDriver 中的所有 C 文件。 其他软件包 如果要使用其他可选模块,也必须包含它们的 C 文件: • 灰度转换功能:位于 GUI\ConvertMono 中的所有 C 文件 • 色彩转换功能:位于 GUI\ConvertColor 中的所有 C 文件 • 抗锯齿:位于 GUI\AntiAlias 中的所有 C 文件 • 存储设备:位于 GUI\MemDev 中的所有 C 文件 • VNC 支持:位于 GUI\VNC 中的所有 C 文件 • 小工具库:位于 GUI\Widget 中的所有 C 文件 • 窗口管理器:位于 GUI\WM 中的所有 C 文件 目标细节 • 对于通过端口/缓冲器访问的显示器,必须定义接口例程。所需例程的示例可在Samples\LCD_X 中找到。 • 必须包含 GUI_X_embOS.c 或 GUI_X.c,以便使用 embOS 或其他 RTOS 进行定时以及与多 任务相关的功能。 请确保将 GUI.h 包含在访问 emWin 的所有源文件中。 2.5 emWin 的配置 Config 文件夹应包含所有配置文件。“配置”一章详细说明了如何配置 emWin。 有以下类型的配置宏可用: 二进制开关 “B” 开关的值可为 0 或 1,0 表示去激活,而 1 表示激活(实际上除 0 以外的任何值都起作用,但是使用 1 时读取配置文件更容易)。这些开关可启用或禁用某些功能或行为。开关是最简单形式的配置宏。 数值 “N” 数值用在代码中某个位置,代替数值常数。典型示例是在显示器分辨率的配置中。 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 36 章节 入门指南 选择开关 “S” 选择开关用于在只能从多个选项中选择一项时选择一个选项。典型示例是选择要用的显示控制器类 型,这时选定的数字表示哪个源代码 (在哪个显示驱动中)用于生成对象代码。 别名 “A” 像简单文本替换一样进行操作的宏。示例为定义 U8,预处理器将替换为不带符号字符。 函数替换 “F” 基本上宏可以像常规函数一样进行处理,尽管有某些限制,因为宏仍可像简单文本替换一样被置入代 码中。函数替换主要用于向具有高度硬件依赖性的模块 (如对显示器的访问)添加特定的功能。此类 型的宏通常用括号 (和可选参数)进行声明。 2.6 初始化 emWin 应使用以下函数来初始化和 “取消初始化” emWin,以便启动配置过程 (请参阅 “配置”(第 905 页)一章),或再次从存储器清除内部数据。 例程 GUI_Init() GUI_Exit() 描述 初始化 emWin 内部数据结构和变量。 从存储器清除 emWin 内部数据。 GUI_Init() 描述 初始化 emWin 内部数据结构和变量。 原型 int GUI_Init(void); 返回值 如果成功,返回 0 ;如果显示驱动初始化失败,则返回其他值。 其他信息 使用任何 emWin 功能前强制执行此功能。唯一例外是为窗口设置创建标记(请参阅“WM_SetCreateFlags()” (第329页))。如果已使用窗口管理器,则在GUI_Init()内创建背景窗口。因此,如果在调用GUI_Init() 前已设置创建标记,则会依据它们创建背景窗口。 GUI_Exit() 描述 从存储器清除 emWin 内部数据,以便可以进一步调用 GUI_Init()。 原型 void GUI_Exit(void); emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 37 其他信息 如果 emWin 代表不继续使用的应用程序部分,应使用此函数,因此必须能再次打开和关闭。请注意, 调用 GUI_Exit 后, emWin 将不能正常工作,直至再次调用 GUI_Init()。 2.7 有目标硬件时使用 emWin 以下只是用emWin开始编程时要采取的通用步骤的基本概述。在后续章节中会进一步说明所有步骤。 第 1 步:配置 emWin 第一步通常是定制 emWin。有关位图转换器的详细信息,请参阅 “配置”(第 905 页)。 第 2 步:定义访问地址或访问例程 对于存储器映射显示控制器,只需在显示控制器的配置文件中定义显示器的访问地址。对于通过端口 / 缓冲器访问的显示器控制器,必须定义接口例程。所需例程的示例可在 Samples\LCD_X 中找到。 第 3 步:编译、链接和测试示例代码 emWin 附带有单任务和多任务环境的示例代码。编译、链接和测试这些小示例程序,直至熟悉这些 操作为止。 第 4 步:修改示例程序 对示例程序进行简单修改。添加其他命令,如在显示器上显示不同尺寸的文本、显示直线等。 第 5 步:在多任务应用程序中:改编以适应您的 OS (必要时) 如果多个任务能同时访问显示器,则宏 GUI_MAXTASK 和 GUI_OS 以及文件 GUITask.c 发挥作用。 有关详细信息和改编示例,请参阅 “配置”(第 905 页)。 第 6 步:使用 emWin 编写自己的应用程序 到目前为止,您应该已经清楚了解如何使用 emWin。考虑如何构建应用要求的程序,并通过调用适 当的例程来使用 emWin。请查阅本手册稍后的参考章节,这些章节讨论了具体的 emWin 功能和可 用的配置宏。 2.8 “Hello world”示例程序 下面所示为 “Hellow world”示例程序。如果希望查看更多基于 emWin 的应用程序示例以及进一 步的简单教程应用程序,请查看 emWin 随附的 Sample 文件夹或访问 www.segger.com 上的 “emWin Samples”部分。 “Hello world”程序在早期就已用作 C 语言编程的起点,因为它基本上是可以编写的最小程序。以 下所示为一个 emWin “Hello world”程序,在 emWin 随附的 Sample\Tutorial 文件夹中名为 BASIC_HelloWorld.c。 该程序的全部目的是将 “Hello world”写入显示器的左上角。为此,必须首先初始化应用程序的硬 件、显示控制器和 GUI。只需在程序开始调用 GUI_Init() 即可初始化 emWin。在本示例中,我 们假定您应用程序的硬件已经初始化。 Hello world 程序如下所示: emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 38 章节 入门指南 #include "GUI.h" void MainTask(void) { GUI_Init(); GUI_DispString("Hello world!"); while(1); } 向 “Hello world”程序添加功能 这个小程序目前能做的还不算很多,现在可以将功能扩展一点:在显示 “Hello world”以后,我们 想要程序开始在屏幕上记数,以便估算向显示器的输出速度。只需将少量代码添加到主程序末尾的循 环中,其作用实际上是调用显示十进制值的函数。 该示例在 Sample 文件夹中,名称为 BASIC_Hello1.c。 #include "GUI.h" void MainTask(void) { int i=0; GUI_Init(); GUI_DispString("Hello world!"); while(1) { GUI_DispDecAt( i++, 20,20,4); if (i > 9999) { i = 0; } } } emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 39 第3章 模拟 emWin 的 PC 模拟允许您在自己的 Windows PC 上使用本机(通常为 Microsoft)编译器编译同一 C 源代码,并为自己的应用程序创建可执行文件。这样做可允许以下操作: • 在您的 PC 上设计用户界面 (无需硬件!); • 调试用户界面程序; • 创建应用程序演示,该演示可用于讨论用户界面。 产生的可执行文件可通过电子邮件轻松发送。 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 40 章节 模拟 3.1 使用模拟 emWin 模拟需要 Microsoft Visual C++ (6.00 或更高版本)和随附的集成开发环境 (IDE)。您 将在 PC 屏上看到 LCD 模拟,其在 X 和 Y 上具有相同的分辨率,且正确配置后可显示与您的 LCD 完 全相同的颜色。模拟的整个图形库 API 和窗口管理器 API 与您目标系统上的相同。因为模拟使用与目 标系统相同的 C 源代码,因此所有功能的执行方式与在目标硬件上完全相同。差别仅在于软件的较低 级别:LCD 驱动。PC 模拟不使用实际的 LCD 驱动,而是使用写入到位图的模拟驱动。然后使用模拟 的第二个线程将位图显示在屏幕上。此第二线程对应用程序不可见,其操作就像 LCD 例程直接写入 显示器。 3.1.1 通过 emWin 试用版使用模拟 emWin 试用版包含一个可让您评估 emWin 所有可用功能的完整库。其中还包括 emWin 查看器(用 于调试应用程序) ,以及字体转换器和位图转换器的演示版本。请记住,使用试用版时您不能查看 emWin 或模拟的源代码,但您仍然可通过试用版熟悉 emWin 的功能。 3.1.1.1 目录结构 试用版中模拟的目录结构如右侧所示。下表说明了文件夹的内容: 目录 Application Config Exe GUI Sample Simulation Tool 内容 演示程序的源代码。 用于构建库的配置文件。注意,头文件的更改对预编译库没有任何 影响! 即时可用的演示程序。 使用库所需的库文件和包含文件。 模拟示例。 模拟需要的文件。 emWin 查看器、位图转换器的演示版本和字体转换器的演示版本。 3.1.1.2 Visual C++ 工作空间 上面显示的根目录包括 Microsoft Visual C++ 工 作 空 间 (SimulationTrial.dsw) 和 项 目 文 件 (SimulationTrial.dsp)。双击工作空间文件即 可打开 Microsoft IDE。 Visual C++ 工作空间的目录结构与右侧显示的目录 结构类似。 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 41 3.1.1.3 编译演示程序 演示程序的源文件位于 Application 目录中,为即用模拟,意味着您只需重建并启动它。注意,需 要安装 Microsoft Visual C++ (6.00 或更高版本)后才能重建可执行文件。 • 第 1 步:双击 SimulationTrial.dsw,打开 Visual C++ 工作空间。 • 第 2 步:从菜单选择 Build/Rebuild All (或按 F7),重建项目。 • 第 3 步:从菜单选择 Build/Start Debug/Go (或按 F5),启动模拟。 演示项目开始运行,可通过右键点击该项目并选择 “退出”随时将其关闭。 3.1.1.4 编译示例 Sample 目录包含演示 emWin 不同功能的即用示例,并提供一些典型应用示例。为构建其中任一个 可执行文件,必须在项目中 “激活”其 C 源代码。使用以下步骤可轻松完成此操作: • 第 1 步:右击工作空间的 Application 文件夹然后选择 Settings\General\Exclude from build,将 Application 文件夹从构建过程中排除。 • 第 2 步:双击工作空间的 Sample 文件夹,将其打开。右击添加要使用的示例并从构建中取消选 择 Settings\General\Exclude。 • 第 3 步:如果示例包含其自身的配置文件 (LCDConf.c 和 / 或 SIMConf.c),则需要从构建 过程中排除位于 config 文件夹下的默认配置文件。 • 第 4 步:从菜单选择 Build/Rebuild All (或按 F7),重建示例。 • 第 5 步:从菜单选择 Build/Start Debug/Go (或按 F5),启动模拟。上面所选示例的结果 图示如下: emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 42 章节 模拟 3.1.2 通过 emWin 源代码使用模拟 3.1.2.1 目录结构 模拟的根目录可位于您 PC 上的任何位置,例如 C:\Work\emWinSim。出现的目录结 构将如右侧所示。此结构与我们为您的目标应用推荐的结构非常相似 (更多详细信息 请参见第 3 章:“使用入门”)。 下表为文件夹的内容: 目录 Doc Sample Start Tool 内容 包含 emWin 文档 代码示例,在此文档后面介绍 使用 emWin 创建新项目需要的所有项目 emWin 发货随附的工具 可通过创建 Start 文件夹副本开始新项目。它包含新项目的所有必需文件。 包含 emWin 源代码的子目录位于 Start\GUI 文件夹下,并将包含与用于 您目标 (交叉)编译器同名目录完全相同的文件。 GUI 子目录的文件不应更 改,因为更改操作会使 emWin 很难更新到更新的版本。 Start\Config 目录包含配置文件,需要修改这些文件以反映您的目标硬件 设置 (主要是可显示的 LCD 尺寸和颜色)。 3.1.2.2 Visual C++ 工作空间 上面显示的根目录包括 Microsoft Visual C++ 工作空间 (Simulation.dsw) 和项目文件 (Simulation.dsp)。利 用工作空间可以修改应用程序,并在目标系统上进行编译之 前对其进行调试。 Visual C++ 工作空间的目录结构外观类似右侧显示的目录 结构。此处,GUI 文件夹是打开的,以显示 emWin 子目录。 注意,您的 GUI 目录可能与图示不完全类似,具体取决于您 所拥有的 emWin 的附加功能。Core、Font 和 LCDDriver 文件夹是基础 emWin 包的一部分,并将始终显示在工作空间 目录中。 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 43 3.1.2.3 编译应用程序 此模拟包含一个或多个应用程序 C 文件(位于 Application 目录下),可以修改或移除,还可将其 他文件添加到项目中。然后应在 Visual C++ 工作空间内重建程序以对其进行测试 / 调试。您对结果 感到满意并想在自己的应用中使用该程序时,应能够在目标系统上编译这些相同的文件,并在目标显 示器上获取相同的结果。使用模拟的常规步骤如下: • 第 1 步:双击 Simulation.dsw,打开 Visual C++ 工作空间。 • 第 2 步:从菜单选择 Build/Rebuild All (或按 F7),编译项目。 • 第 3 步:从菜单选择 Build/Start Debug/Go (或按 F5),执行模拟。 • 第 4 步:使用您自己的标识或图片替换位图。 • 第 5 步:根据需要,通过编辑源代码或添加 / 删除文件进一步修改应用程序。 • 第 6 步:在 Visual C++ 内编译并运行应用程序以测试结果。根据需要继续进行修改和调试。 • 第 7 步:在目标系统上编译并运行应用程序。 3.1.3 模拟的高级功能 单击鼠标右键,会显示带有几个高级功能的上下文菜单: 3.1.3.1 暂停和恢复 这些菜单项允许暂停并恢复模拟中当前运行的应用程序。通 过按 可执行相同操作。尝试暂停一个已暂停 的应用程序或尝试恢复一个已运行的应用程序都会导致错误 消息。 3.1.3.2 查看系统信息 此菜单项打开另一个窗口,该窗口带有应用程序当 前使用存储器的信息。该窗口通过显示可用字节和 已用字节以及存储块的可用数目和已用数目,持续 显示存储器消耗的当前状态。有关存储器管理器的 详细信息,请参阅 “配置”(第 905 页)。 3.1.3.3 复制到剪贴板 此菜单项将显示器的当前内容复制到剪贴板。此功能使用户可轻松记录其他应用程序。 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 44 章节 3.2 设备模拟 设备模拟支持 3 种视图: • 生成的框架视图 • 自定义位图视图 • 窗口视图 下表显示了这三种不同的视图: 生成的框架视图 模拟 自定义位图视图 窗口视图 下面将详细介绍如何使用每个选项。 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 45 3.2.1 生成的框架视图 模拟将显示器显示在一个自动生成的包围该显示器的框架内。框架 包含一个小按钮,该按钮默认情况下关闭应用程序。对于单层系 统,这是模拟的默认操作。“单层系统”的意思是仅第一层进行了 初始化。 3.2.2 自定义位图视图 模拟可在您选择的位图中显示模拟显示器,通常是您的目标设备。位图可用于模拟整个目标设备的操 作。要模拟设备的外观,必需使用位图。 设备位图 第一个位图通常是一张设备照片 (顶视图),并需要 命名为 Device.bmp。此位图可以是单独的文件(与 可执行文件在同一目录下),或者也可以将其作为应 用程序中的资源包括。详细操作方法请见本章后面。 此文件应提供一个像素大小与物理显示屏分辨率相 同的模拟显示器区域。 如果存在任何要模拟的硬键,则位图还应显示处于 未按下状态的所有这些硬键。 透明区域需要使用函数 SIM_GUI_SetTransColor() 定义的颜色着色,通常为鲜红色 (0xFF0000)。这些 区域不必须是矩形。它们可以为任意形 (可达到一定 复杂度,具体取决于您操作系统的限制,但通常都有 足够的随意性)。鲜红色是透明区域的默认颜色,主要 是因为大多数位图通常都不包含此颜色。要使用鲜红色位图,可使用函数 SIM_GUI_SetTransColor() 更改默认的透明颜色。 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 46 章节 模拟 硬键位图 需要第二个位图文件定义硬键,且必须将其命名为 Device1.bmp。它包含处于按下状态的按钮。无硬 键区域需要使用透明色填充。这仅是一个简短说明。 有关如何模拟硬键的更多详细信息,请参见 “硬键 模拟”(第 52 页)。 使用单独的文件 启动模拟时,它会检查可执行文件的目录是否包含 位图文件 Device.bmp 和 Device1.bmp。如果这 些文件可用,则会自动使用并忽略资源位图。注意, 这仅在单层系统下有效。 添加位图到应用程序资源文件 模拟的资源文件在 System\Simulation\Res\Simulation.rc 下,它包含以下部分: ///////////////////////////////////////////////////////////////////////////// // // Customizable bitmaps // IDB_DEVICE BITMAP DISCARDABLE "Device.bmp" IDB_DEVICE1 BITMAP DISCARDABLE "Device1.bmp" 本节可用于设置自定义设备文件。有关更多信息,请参见 Win32 文档。 3.2.3 窗口视图 模拟多层系统的默认方法是在单独的窗口显示每一层,而不使用位图或生成的框架。 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 47 3.3 设备模拟 API 所有的设备模拟 API 函数都应在设置阶段调用。调用应从例程 SIM_X_Config() 内部执行,该函数 位于配置文件夹的文件 SIMConf.c 中。下面的示例在设置中调用 SIM_SetLCDPos(): #include "LCD_SIM.h" void SIM_X_Config() { SIM_GUI_SetLCDPos(50, 20); // Define the position of the LCD in the bitmap} } 下表按字母顺序列出可用的设备模拟相关例程。例程的详细说明如下: 例程 SIM_GUI_ShowDevice() SIM_GUI_SetCallback() SIM_GUI_SetCompositeColor() SIM_GUI_SetCompositeSize() SIM_GUI_SetLCDColorBlack() SIM_GUI_SetLCDColorWhite() SIM_GUI_SetLCDPos() SIM_GUI_SetMag() SIM_GUI_SetTransColor() SIM_GUI_UseCustomBitmaps() 描述 管理设备位图的可见性。 设置用于接收模拟窗口句柄的回调函数。 设置复合窗口的背景色。(仅用于多层系统) 设置复合窗口的尺寸。(仅用于多层系统) 将要使用的颜色设置为黑色 (单色显示器)。 将要使用的颜色设置为白色 (单色显示器)。 在目标设备位图中设置模拟 LCD 的位置。 设置 X 和 / 或 Y 轴的放大系数。 设置要用于透明区域的颜色 (默认:0xFF0000)。 指示模拟使用来自应用程序资源文件的自定义位图。 SIM_GUI_ShowDevice() 描述 此函数可用于管理模拟的周围设备位图的可见性。 原型 void SIM_GUI_ShowDevice(int OnOff); 参数 OnOff 1 表示显示位图, 0 表示隐藏位图。 描述 其他信息 在多层系统上,设备位图默认情况下不显示,在单层系统上则位图可见。如果需要不同的特性,则此 函数可用于设置设备位图的可见性。 SIM_GUI_SetCallback() 描述 如果不只是需要模拟显示器窗口或硬键,则可设置回调函数来接收模拟的窗口句柄。这可实现在显示 窗口外侧添加附加控件 (如 LED 或滑块)等功能。请注意不能在此处使用 emWin 函数。 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 48 章节 模拟 原型 void SIM_GUI_SetCallback(int (* _pfInfoCallback)(SIM_GUI_INFO * pInfo)); 参数 _pfInfoCallback 描述 指向回调函数的指针。此函数必须有一个指向 SIM_GUI_INFO 结构的指针作为参数 类型 HWND HWND HWND 名称 hWndMain ahWndLCD[16] ahWndColor[16] SIM_GUI_INFO 结构的内容 主窗口句柄 显示层的句柄数组 图层句柄的数组 描述 SIM_GUI_SetCompositeColor() 描述 在模拟多层系统时,每层都可在其自己的窗口中显示。但物理显示器只有一个区域,它显示层混合的 结果。模拟在复合窗口中显示结果,该窗口可具有其自己的尺寸,与层无关。在复合窗口内每层都可 有其自己的位置和尺寸。这意味着层不必覆盖整个区域。这种情况下 (还针对透明效果),此函数设 置复合窗口的默认背景色。 原型 void SIM_GUI_SetCompositeColor(U32 Color); 参数 Color 要使用的背景颜色。 描述 SIM_GUI_SetCompositeSize() 描述 如上所述,在 SIM_GUI_SetCompositeColor() 下面,复合窗口的尺寸与层的尺寸无关。此函数 用于设置复合窗口的尺寸。 原型 void SIM_GUI_SetCompositeSize(int xSize, int ySize); 参数 xSize ySize 水平像素尺寸。 垂直像素尺寸。 描述 示例 下面显示了一个典型应用 (对于多层系统): void SIM_X_Config() { SIM_GUI_SetCompositeSize(240, 320); // Set size of composite window SIM_GUI_SetCompositeColor(0x800000); // Define background color of composite window } emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 49 SIM_GUI_SetLCDColorBlack(), SIM_GUI_SetLCDColorWhite() 描述 分别将要使用的颜色设置为黑色或白色 (在单色显示器上)。 原型 int SIM_GUI_SetLCDColorBlack(int DisplayIndex, int Color); int SIM_GUI_SetLCDColorWhite(int DisplayIndex, int Color); 参数 DisplayIndex 留待将来使用,必须为 0。 Color 颜色的 RGB 值。 描述 其他信息 这些函数可用于模拟显示器的真实背景色。 默认颜色值为黑色和白色,或 0x000000 和 0xFFFFFF。 使用默认设置的示例 void SIM_X_Config() { SIM_GUI_SetLCDPos(14,84); SIM_GUI_SetLCDColorBlack (0, 0x000000); SIM_GUI_SetLCDColorWhite (0, 0xFFFFFF); (used for colored monochrome displays) } // Define the position of the LCD // in the bitmap // Define the color used as black // Define the color used as white 使用黄色替代白色的示例 void SIM_X_Config() { SIM_GUI_SetLCDPos(14,84); SIM_GUI_SetLCDColorBlack (0, 0x000000); SIM_GUI_SetLCDColorWhite (0, 0x00FFFF); (used for colored monochrome displays) } // Define the position of the LCD // in the bitmap // Define the color used as black // Define the color used as white emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 50 章节 模拟 SIM_GUI_SetLCDPos() 描述 在目标设备位图中设置模拟 LCD 的位置。 原型 void SIM_GUI_SetLCDPos(int x, int y); 参数 x y 模拟 LCD 左上角的 X 位置 (像素值)。 模拟 LCD 左上角的 Y 位置 (像素值)。 描述 其他信息 X 和 Y 位置与目标设备位图相关,因此位置 (0,0) 指向位图而不是实际 LCD 的左上角 (原点)。 只有被模拟屏幕的原点需要指定。您显示器的分辨率应已反映在 Config 目录下的配置文件中。 使用此函数可启用位图 Device.bmp 和 Device1.bmp。注意,这些值需要 >= 0 才能启用位图。 如果应禁用设备位图,则在 SIM_X_Init() 中删除对此函数的调用。 SIM_GUI_SetMag() 描述 设置 X 和 / 或 Y 轴的放大系数。 原型 void SIM_GUI_SetMag(int MagX, int MagY); 参数 MagX MagY X 轴的放大系数。 Y 轴的放大系数。 描述 其他信息 默认情况下,对于模拟显示器的每个像素模拟操作都使用 PC 上的一个像素。此函数的使用对小型显 示器非常有用。如果使用了设备位图并且放大率 >1,则设备位图需要修改以适应放大率。设备位图 不自动放大。 SIM_GUI_SetTransColor() 描述 设置设备或硬键位图透明区域要使用的颜色。 原型 I32 SIM_GUI_SetTransColor(I32 Color); 参数 Color 描述 颜色的 RGB 值,采用格式 00000000RRRRRRRRGGGGGGGGBBBBBBBB。 其他信息 透明区的默认设置为鲜红色 (0xFF0000)。 如果您的位图包含同样的红色阴影,您通常只需更改此设置。 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 51 SIM_GUI_UseCustomBitmaps() 描述 如本章前面所述,可以使用来自应用程序资源文件的设备位图。此函数指示模拟操作使用来自应用程 序资源文件的设备和硬键位图,且不生成默认的框架位图。 原型 void SIM_GUI_UseCustomBitmaps(void); 其他信息 emWin发货时默认包含2个位图Device.bmp和Device1.bmp,位于Start\System\Simulation\Res 中,可用作您自己位图的起点。 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 52 章节 模拟 3.4 硬键模拟 硬键模拟只能在自定义位图视图中使用。硬键还可以作为设备的一部分进行模拟,并可使用鼠标指针 选择。该理念能够区分模拟设备上的键或按钮是否被按下。只要按住鼠标按钮,则认为硬键被 “按 下”;释放鼠标按钮或将指针从硬键上移走会 “取消按下”该键。按下和取消按下之间的切换操作还 可使用例程 SIM_HARDKEY_SetMode() 指定。 为了模拟硬键,您需要设备的第二个位图,该位图除了键本身 (处于按下状态)外,其他部分为透 明。如本章之前所述,此位图可以是目录中的单独文件,或作为可执行文件中的资源包括。硬键可为 任意形状,只要它们在 Device.bmp 和 Device1.bmp 中的像素尺寸完全相同。以下示例说明了这 一点: 设备位图:未按下硬键状态 (Device.bmp) 设备硬键位图:按下硬键状态 (Device1.bmp) 使用鼠标 “按下”键时,硬键位图 (Device1.bmp) 的相应部分将覆盖设备位图,以显示处于按下状 态的该键。 这些键可以定期轮询,以确定其状态 (按下 / 未按下)是否更改以及是否需要更新。或者,回调例程 可设置为在硬键状态更改时触发特定操作。 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 53 3.4.1 硬键模拟 API 硬键模拟函数是随 emWin 发货的标准模拟程序的一部分。如果使用用户定义的 emWin 模拟,则这些 函数可能不可用。下表按字母顺序在各自类别下列出可用的硬键模拟相关例程。例程的详细说明如下: 例程 SIM_HARDKEY_GetNum() SIM_HARDKEY_GetState() SIM_HARDKEY_SetCallback() SIM_HARDKEY_SetMode() SIM_HARDKEY_SetState() 描述 返回可用硬键的数目。 返回指定硬键的状态 (0:未按下, 1:按下)。 设置在指定硬键的状态更改时要执行的回调例程。 设置指定硬键的特性 (默认值 = 0:不切换)。 设置指定硬键的状态 (0:未按下, 1:按下)。 SIM_HARDKEY_GetNum() 描述 返回可用硬键的数目。 原型 int SIM_HARDKEY_GetNum(void); 返回值 位图中找到的可用硬键的数目。 其他信息 硬键的编号顺序为标准的读取顺序 (从左到右,然后从顶至底)。因此最先找到的是硬键最顶部的像 素,无 论 其 水 平 位 置 如 何。例 如,在 下 面 的 位 图 中,对 硬 键 进 行 了 标 记,使 它 们 在 其 他 函 数 中 被 KeyIndex 参数引用: 建议调用此函数以验证位图是否正确加载。 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 54 章节 模拟 SIM_HARDKEY_GetState() 描述 返回指定硬键的状态。 原型 int SIM_HARDKEY_GetState(unsigned int KeyIndex); 参数 KeyIndex 硬键的索引 (0 = 第一个键的索引)。 描述 返回值 指定硬键的状态: 0:未按下 1:按下 SIM_HARDKEY_SetCallback() 描述 设置在指定硬键的状态更改时要执行的回调例程。 原型 SIM_HARDKEY_CB * SIM_HARDKEY_SetCallback(unsigned int KeyIndex, SIM_HARDKEY_CB * pfCallback); 参数 KeyIndex pfCallback 硬键的索引 (0 = 第一个键的索引)。 指向回调例程的指针。 描述 返回值 指向上一回调例程的指针。 其他信息 注意,如果需要在回调函数中调用 GUI 函数,则必须启用多任务支持。没有多任务支持,则只应使用 可以在中断例程中调用的 GUI 函数。 回调例程必须具有以下原型: 原型 typedef void SIM_HARDKEY_CB(int KeyIndex, int State); 参数 KeyIndex State 硬键的索引 (0 = 第一个键的索引)。 指定硬键的状态 (见下表)。 描述 参数 State 的允许值 0 未按下。 1 按下。 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 55 SIM_HARDKEY_SetMode() 描述 设置指定硬键的特性。 原型 int SIM_HARDKEY_SetMode(unsigned int KeyIndex, int Mode); 参数 KeyIndex Mode 硬键的索引 (0 = 第一个键的索引)。 操作模式 (见下表)。 描述 参数 Mode 的允许值 0 正常操作 (默认)。 1 切换操作。 其他信息 正常 (默认)的硬键操作表示只要鼠标按钮按在键上,就认为键被按下。当鼠标释放或从硬键上移走 时,认为键被取消按下。 对于切换操作,每次单击鼠标会将硬键的状态在按下和取消按下间切换。也就是说,如果您在硬键上 单击鼠标且其变为按下状态,则该硬键将保持按下状态直到您再次在其上单击鼠标。 SIM_HARDKEY_SetState() 描述 设置指定硬键的状态。 原型 int SIM_HARDKEY_SetState(unsigned int KeyIndex, int State); 参数 KeyIndex State 硬键的索引 (0 = 第一个键的索引)。 指定硬键的状态 (见下表)。 描述 参数 State 的允许值 0 未按下。 1 按下。 其他信息 仅当 SIM_HARDKEY_SetMode() 设置为 1 (切换模式)时此函数才可用。 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 56 章节 模拟 3.5 集成 emWin 模拟到现有模拟中 要将 emWin 模拟集成到现有模拟中,模拟的源代码不是必需的。模拟的源代码通常不随 emWin 一 同发货。它是单独 (可选)的软件项目,不包括在 emWin 基础包中。 通常不需要 emWin 模拟的源代码,但可作为可选软件项目提供。如本章前面所述,基础包和试用版 包含模拟库。例如,如果要将 emWin 模拟添加到现有硬件或实时内核 (RTOS) 模拟中,则可使用此 库的 API 函数。 要将 emWin 模拟添加到现有模拟中(采用 C 或 C++ 编写,使用 Win32 API),只需添加几行代码。 3.5.1 目录结构 System 文件夹的子文件夹 Simulation 包含 emWin 模拟。目录结构显 示在右侧。下表说明了该子文件夹的内容: 目录 Simulation Res SIM_GUI WinMain 内容 要与模拟源代码一起和不一起使用的模拟源文件和头文件。该文件夹还包含即用模拟库。 资源文件。 GUI 模拟源代码 (可选)。 包含 WinMain 例程。 3.5.2 使用模拟库 以下步骤显示如何使用模拟库将 emWin 模拟集成到现有模拟中: • 第 1 步:将模拟库 GUISim.lib 添加到项目中。 • 第 2 步:按第 2.1.1 章 “子目录”中所述将所有 GUI 文件添加到项目中。 • 第 3 步:按第 2.1.2 章 “包含目录”中所述将包含目录添加到项目中。 • 第 4 步:修改 WinMain。 3.5.2.1 修改 WinMain 每个 Windows Win32 程序都以 WinMain() 开始 (与普通的命令行 C 程序相反,其以 main() 开 始)。所有要做的就是将几行代码添加到此例程中。 需要添加以下函数调用 (通常按照其在下面应用程序代码示例中显示的顺序): • SIM_GUI_Init • SIM_GUI_CreateLCDWindow • CreateThread • SIM_GUI_Exit emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 57 3.5.2.2 应用程序示例 下面的应用程序在 Sample\WinMain\SampleApp.c 下提供,显示了如何将 emWin 模拟集成到现 有应用程序中: #include #include "GUI_SIM_Win32.h" void MainTask(void); /********************************************************************* * * _Thread */ static DWORD __stdcall _Thread(void* Parameter) { MainTask(); return 0; } /********************************************************************* * * _WndProcMain */ static LRESULT CALLBACK _WndProcMain(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { SIM_GUI_HandleKeyEvents(message, wParam); switch (message) { case WM_DESTROY: PostQuitMessage(0); break; } return DefWindowProc(hWnd, message, wParam, lParam); } /********************************************************************* * * _RegisterClass */ static void _RegisterClass(HINSTANCE hInstance) { WNDCLASSEX wcex; memset(&wcex, 0, sizeof(wcex)); wcex.cbSize = sizeof(WNDCLASSEX); wcex.hInstance = hInstance; wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = (WNDPROC)_WndProcMain; wcex.hIcon = 0; wcex.hCursor = LoadCursor(NULL, IDC_ARROW); wcex.hbrBackground = (HBRUSH)(COLOR_APPWORKSPACE + 1); wcex.lpszMenuName = 0; wcex.lpszClassName = "GUIApplication"; RegisterClassEx(&wcex); } /********************************************************************* * * WinMain */ int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { DWORD ThreadID; MSG Msg; HWND hWndMain; /* Register window class */ _RegisterClass(hInstance); /* Create main window */ hWndMain = CreateWindow("GUIApplication", "Application window", WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_VISIBLE, 0, 0, 328, 267, NULL, NULL, hInstance, NULL); /* Initialize the emWin simulation and create a LCD window */ SIM_GUI_Init(hInstance, hWndMain, lpCmdLine, "embOSIAR - emWin Simulation"); SIM_GUI_CreateLCDWindow(hWndMain, 0, 0, 320, 240, 0); /* Create a thread which executes the code to be simulated */ CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)_Thread, NULL, 0, &ThreadID); /* Main message loop */ while (GetMessage(&Msg, NULL, 0, 0)) { TranslateMessage(&Msg); DispatchMessage(&Msg); } SIM_GUI_Exit(); } emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 58 章节 模拟 3.5.3 集成到 embOS 模拟中 3.5.3.1 WinMain 以下示例代码显示如何修改 emWin 模拟的现有 WinMain 以集成 embOS 模拟。红色行将添加到 WinMain 以初始化 emWin 模拟、创建模拟窗口并退出 emWin 模拟: ... #include "GUI_SIM_Win32.h" ... int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { MSG Msg; HACCEL hAccelTable; HWND hWndMain; BITMAP BmpDevice; DWORD ThreadID; /* Init global data */ _StopHyperThreading(); _hInst = hInstance; /* Register main window class */ _RegisterClass(); /* Load bitmap */ _hBmpDevice = (HBITMAP)LoadImage(_hInst, (LPCTSTR) IDB_DEVICE, IMAGE_BITMAP, 0, 0, 0); _hMenuPopup = LoadMenu(_hInst, (LPCSTR)IDC_CONTEXTMENU); _hMenuPopup = GetSubMenu(_hMenuPopup, 0); /* Create main window */ GetObject(_hBmpDevice, sizeof(BmpDevice), &BmpDevice); hWndMain = CreateWindowEx(WS_EX_TOPMOST, _sWindowClass, "embOSIAR Simulation", WS_SYSMENU | WS_CLIPCHILDREN | WS_POPUP | WS_VISIBLE, 10, 20, BmpDevice.bmWidth, BmpDevice.bmHeight, NULL, NULL, _hInst, NULL); if (!hWndMain) { return 1; /* Error */ } /* Init emWin simulation and create window */ SIM_GUI_Init(hInstance, hWndMain, lpCmdLine, "embOSIAR - emWin Simulation"); SIM_GUI_CreateLCDWindow(hWndMain, 80, 50, 128, 64, 0); /* Show main window */ ShowWindow(hWndMain, nCmdShow); /* Load accelerator table */ hAccelTable = LoadAccelerators(_hInst, (LPCTSTR)IDC_WINMAIN); /* application initialization:*/ CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Thread, NULL, 0, &ThreadID); /* main message loop */ if (SIM_Init(hWndMain) == 0) { while (GetMessage(&Msg, NULL, 0, 0)) { if (!TranslateAccelerator(Msg.hwnd, hAccelTable, &Msg)) { TranslateMessage(&Msg); DispatchMessage(&Msg); } } } /* Exit emWin simulation */ SIM_GUI_Exit(); return 0; } emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 59 3.5.3.2 目标程序 (main) emWin API 可从一个或多个目标线程调用。没有 RTOS 时, WIN32 API 函数 CreateThread 通 常用于创建调用 emWin API 的目标线程。在 RTOS 模拟内,目标任务 / 线程(由模拟 RTOS 创建) 用于调用 emWin API。换句话说:使用 OS_CreateTask 创建用户界面任务。下面是修改后的 embOS 启动应用程序: #include "RTOS.H" #include "HW_LED.h" #include "GUI.h" OS_STACKPTR int Stack0[128], Stack1[128], Stack2[2000]; /* Task stacks */ OS_TASK TCB0, TCB1, TCB2; /* Task-control-blocks */ void Task0(void) { while(1) { HW_LED_Toggle0(); OS_Delay(100); } } void Task1(void) { while(1) { HW_LED_Toggle1(); OS_Delay(500); } } void main(void) { GUI_COLOR aColor[] = {GUI_RED, GUI_YELLOW}; GUI_Init(); while(1) { int i; for (i = 0; i < 2; i++) { GUI_Clear(); GUI_SetColor(aColor[i]); GUI_SetFont(&GUI_FontComic24B_ASCII); GUI_DispStringAt("Hello world!", 1, 1); OS_Delay(200); } } } /********************************************************** * * main */ #include void main(void) { OS_IncDI(); /* Initially disable interrupts */ OS_InitKern(); /* initialize OS */ OS_InitHW(); /* initialize Hardware for OS */ /* You need to create at least one task here !*/ OS_CREATETASK(&TCB0, "HP Task", Task0, 100, Stack0); OS_CREATETASK(&TCB1, "LP Task", Task1, 50, Stack1); OS_CREATETASK(&TCB2, "GUI Task", MainTask, 80, Stack2); OS_Start(); /* Start multitasking */ } 下表显示集成 emWin 模拟之前和之后的模拟: 之前 之后 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 60 章节 模拟 3.5.4 GUI 模拟 API 下表按字母顺序在各自类别下列出用户定义模拟程序可使用的例程。这些函数仅可用于 emWin 模拟 的源代码。例程的详细说明如下: 例程 SIM_GUI_CreateLCDInfoWindow() SIM_GUI_CreateLCDWindow() SIM_GUI_Exit() SIM_GUI_Init() SIM_GUI_SetLCDWindowHook() 描述 创建一个窗口,显示尺寸和位置给定的选定层的可用颜色。 创建尺寸和位置给定的 LCD 窗口。 停止 GUI 模拟。 初始化 GUI 模拟。 设置 LCD 窗口接收消息时要调用的挂钩函数。 SIM_GUI_CreateLCDInfoWindow() 描述 创建一个窗口,显示选定层的可用颜色。 原型 HWND SIM_GUI_CreateLCDInfoWindow(HWND hParent, int x, int y, int xSize, int ySize int LayerIndex); 参数 hParent x y xSize ySize LayerIndex 描述 父窗口的句柄。 父坐标中的 X 位置。 父坐标中的 Y 位置。 新窗口的 X 像素尺寸。如果使用 1 和 8 之间的颜色深度,应为 160,如果在高色彩模式下工作,则 为 128。 新窗口的 Y 像素尺寸。如果使用 1 和 8 之间的颜色深度,应为 160,如果在高色彩模式下工作,则 为 128。 要显示层的索引。 其他信息 创建的颜色窗口没有框架、标题栏和按钮。 示例 SIM_GUI_CreateLCDInfoWindow(hWnd, 0, 0, 160, 160, 0); 截屏 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 61 SIM_GUI_CreateLCDWindow() 描述 创建一个窗口,模拟在给定位置具有给定尺寸的 LCD 显示器。 原型 HWND SIM_GUI_CreateLCDWindow(HWND hParent, int x, int y, int xSize, int ySize int LayerIndex); 参数 hParent x y xSize ySize LayerIndex 父窗口的句柄。 父坐标中的 X 位置。 父坐标中的 Y 位置。 新窗口的 X 像素尺寸。 新窗口的 Y 像素尺寸。 要显示层的索引。 描述 其他信息 所有到指定层的显示输出都将在此窗口显示。窗口尺寸应与 LCDConf.c 中的配置相同。 创建的模拟窗口没有框架、标题栏和按钮。 SIM_GUI_Exit() 描述 此函数应在模拟返回到调用进程之前调用。 原型 void SIM_GUI_Exit(void); SIM_GUI_Init() 描述 此函数初始化 emWin 模拟,并应在任何其他 SIM_GUI... 函数调用之前调用。 原型 int SIM_GUI_Init(HINSTANCE hInst, HWND hWndMain, char * pCmdLine, const char * sAppName); 参数 hInst hWndMain pCmdLine sAppName 传递到 WinMain 的当前实例的句柄。 模拟主窗口的句柄。 指向传递到 WinMain 的命令行的指针 指向包含应用程序名称的字符串的指针。 描述 其他信息 要显示消息框,则使用参数 hWndMain 和 sAppName。 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 62 章节 模拟 SIM_GUI_SetLCDWindowHook() 描述 设置如果 LCD 窗口接收消息时要从模拟调用的挂钩函数。 原型 void SIM_GUI_SetLCDWindowHook(SIM_GUI_tfHook * pfHook); 参数 pfHook 指向挂钩函数的指针。 描述 挂钩函数的原型 int Hook(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam, int * pResult); 参数 hWnd Message wParam lParam pResult 描述 LCD 窗口的句柄。 从操作系统接收的消息。 系统传递的 wParam 消息参数。 系统传递的 lParam 消息参数。 指向用作返回代码的整数的指针,该返回代码表示消息是否已被挂钩函数处理。 返回值 如果消息已处理,则挂钩函数将返回 0。此时, GUI 模拟忽略该消息。 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 63 第4章 查看器 如果调试应用程序时使用模拟操作,则在对源代码执行单步调试时将无法看到显示输出。查看器的主 要作用就是解决这一问题。模拟调试时,它会显示模拟屏幕的内容。 查看器可以提供以下额外功能: • 每个图层都有多个窗口 • 在单个窗口中查看整个虚拟图层 • 放大每个图层窗口 • 使用多个图层时复合视图 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 64 章节 4.1 使用查看器 查看器可以: • 为任一图层 / 显示打开多个窗口 • 放大某个图层 / 显示的任一区域 • 查看各个图层/显示的内容以及多层配 置的复合视图 • 使用虚拟屏幕支持时,查看虚拟屏幕 和可见显示的内容 屏幕截图显示查看器显示单层配置的输 出。左上角显示模拟显示。右上角的窗口展 示显示配置的可用颜色。查看器底部是展 示模拟显示放大区域的辅助显示窗口。开 始调试应用程序时,查看器会为每个图层 展示一个显示窗口和颜色窗口。多图层配 置时,复合视图窗口也可见。 查看器 4.1.1 使用模拟和查看器 如果调试应用程序时使用模拟操作,则在对源代码执行单步调试时将无法看到显示输出。这是由于 Win32 的限制:如果一个线程 (正在进行调试)停止,该进程的其他所有线程也会停止。这包括在 屏幕上输出模拟显示的线程。 emWin 查看器解决这一问题的方式是:在独立流程中分别显示模拟的显示窗口和颜色窗口。我们可 以自行决定是在调试应用程序之前还是在调试过程中启动查看器。我们建议: • 第 1 步:启动查看器。模拟开始前,没有显示窗口或颜色窗口出现。 • 第 2 步:打开 Visual C++ 工作空间。 • 第 3 步:编译和运行应用程序。 • 第 4 步:按前述方法调试应用程序。 优点是可以在 LCD 窗口中一步步跟踪所有绘制操作。 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 65 4.1.2 使用带虚拟页面的查看器 查看器默认为每个图层打开一个窗口,显示视频 RAM (通常为屏幕)的可见部分。如果配置的虚拟 视频 RAM 比屏幕大,则可使用指令 View/Virtual Layer/Layer (0...4) 在单个窗口中显示 全部视频 RAM。如果使用函数 GUI_SetOrg(),则可见屏幕的内容将发生改变,但虚拟图层窗口保 持不变: 可见屏幕 页面 0 通常为 “主屏幕” 页面 1 通常为 “设置”屏幕 页面 2 用于各种 不同屏幕 更多关于虚拟屏幕的信息,请参见 “虚拟屏幕 / 虚拟页面”(第 739 页)。 4.1.3 总在顶部显示 查看器窗口默认为总在顶部显示。可以从菜单中选择 Options\Always on top 改变这一方式。 4.1.4 打开显示输出的更多窗口 如需显示 LCD 输出的放大区域或多图层配置的复合视图,可以打开多个输出窗口。可以通过 View/ Visible Layer/Layer (1...4)、 View/Virtual Layer/Layer (1...4) 或 View/Composite 实现该功能。 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 66 章节 4.1.5 缩放 放大或缩小很方便: 右击图层或复合窗口,打开 “缩放”弹出菜单。 选择一个缩放选项: 使用网格 查看器 如果将 LCD 输出放大 >= 300%,可以选择是否使用网格显示。可更改网格的颜色。这可以通过选 择 “菜单”,单击 Options/Grid color 实现。 调节窗口大小 如需根据放大图像调节窗口大小,从第一个弹出菜单选择 “将窗口缩放为屏幕大小” 。 4.1.6 将输出复制到剪贴板 右 击 LCD 窗 口 或 复 合 视 图,选 择 “复 制 到 剪 贴 板” 。例 如,现 在 可 以 将 剪 贴 板 的 内 容粘 贴 到 “mspaint”应用中。 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 67 4.1.7 使用带多种显示的查看器 如果要使用多种显示,则可以通过使用指令 Options/Multi layer/display 将查看器设置为 “多种显示模式” 。 启动调试器时,查看器将为每种显示打开一个显示窗口和一个颜色窗口: 4.1.8 使用带多种显示的查看器 如果要使用多种显示,则可以通过使用指令 Options/Multi layer/display 将查看器设置为 “多种显示模式”。 启动调试器时,查看器将为每个图层打开一个 LCD 窗口和一个颜色窗口,并打开一个复合窗口显示 结果。 示例 以下示例为带两个图层的查看器屏幕截图。图层 0 显示的是高色彩配置的彩色条。图层 1 显示的是白 色背景上的透明圆圈,带有色长方块。复合窗口显示的是屏幕上实际可见的结果 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 68 章节 透明 查看器复合窗口显示所有图层。高索引图层位于低索引图层的上方,可以使用透明像素: 不透明 像素可能透明 Layer 0 Layer 1 ... Layer n 查看器 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 69 第5章 显示文本 使用 emWin 显示文本很容易。仅需要很少的例程知识,就可以使用任何有效的字体进行文本书写,然 后显示在任一位置上。我们首先简单介绍一下文本显示,然后分别对各个可用的例程进行详细描述。 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 70 章节 显示文本 5.1 基本例程 要在 LCD 上显示文本,只需调用例程 GUI_DispString() 并以要显示的文本作为参数即可。例如: GUI_DispString("Hello world!"); 上述代码将在当前文本位置显示文本 “Hello world”。然而,正如我们将看到的,有很多例程可以 使用不同字体或在特定位置显示文本。此外,它不仅可以写字符串,还可以写十进制、十六进制以及 二进制数值进行显示。尽管图形显示通常以字节为向导,文本可以定位在屏幕的任何像素上,而不仅 仅按字节定位。 控制字符 控制字符是指字符代码小于 32 的字符。控制字符被定义为 ASCII 代码的一部分。 emWin 忽略了下 表所列字符以外的所有控制字符: 字符 代码 10 13 ASCII 代码 C LF \n CR \r 描述 换行。 当前文本位置改变至下一行的开始。默认为:X = 0。 Y + = 字体 - 距离 (单位:像素)(如例程 GUI_GetFontDistY() 计算得出)。 回车。 当前文本位置改变至当前行的开始。默认为:X = 0。 控制字符 LF 的用法在字符串中非常方便。换行符可以作为字符串的一部分,这样,字符串就可以拆 分为多行,且只需调用一个例程就能显示。 将文本置于所选位置 这可以通过例程 GUI_GotoXY() 实现,如下面的例子所示: GUI_GotoXY(10,10);// Set text position (in pixels) GUI_DispString("Hello world!");// Show text emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 71 5.2 文本 API 下表按字母顺序列出了相应类别中与文本相关的可用例程。各例程将在后续章节中详细描述。 例程 描述 显示文本的例程 GUI_DispChar() 在当前位置显示单个字符。 GUI_DispCharAt() 在指定位置显示单个字符。 GUI_DispChars() 按指定次数显示字符。 GUI_DispNextLine() 将光标移至下一行的开始。 GUI_DispString() 在当前位置显示字符串。 GUI_DispStringAt() 在指定位置显示字符串。 GUI_DispStringAtCEOL() 在指定位置显示字符串,并清除至行末。 GUI_DispStringHCenterAt() 在指定位置水平居中显示字符串。 GUI_DispStringInRect() 在指定的矩形区域中显示字符串。 GUI_DispStringInRectEx() 在指定的矩形区域中显示字符串,并可旋转 (可选)。 GUI_DispStringInRectWrap() 在指定的矩形区域中显示字符串,并可自动换行 (可选)。 GUI_DispStringLen() 在当前位置显示指定字符数的字符串。 GUI_WrapGetNumLines() 为指定自动换行模式获取文本行数。 选择文本绘制模式 GUI_GetTextMode() 返回当前文本模式。 GUI_SetTextMode() 设置文本绘制模式。 GUI_SetTextStyle() 设置要使用的文本样式。 选择文本对齐模式 GUI_GetTextAlign() 返回当前文本对齐模式。 GUI_SetLBorder() 设置换行后的左边界。 GUI_SetTextAlign() 设置文本对齐模式。 设置当前文本位置 GUI_GotoX() 设置当前 X 位置。 GUI_GotoXY() 设置当前 (X,Y) 位置。 GUI_GotoY() 设置当前 Y 位置。 返回当前文本位置 GUI_GetDispPosX() GUI_GetDispPosY() 返回当前 X 位置。 返回当前 Y 位置。 清除窗口或部分窗口的例程 GUI_Clear() 清除活动窗口 (如果背景是活动窗口,则清除整个显示) GUI_DispCEOL() 清除从当前文本位置到行末的显示内容。 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 72 章节 显示文本 5.3 显示文本的例程 GUI_DispChar() 描述 在当前窗口的当前文本位置处,使用当前字体显示单个字符。 原型 void GUI_DispChar(U16 c); 参数 c 显示的字符。 描述 其他信息 这是显示单个字符的基本例程。所有其他显示例程 (GUI_DispCharAt()、 GUI_DispString() 等)都要调用这个例程来输出单个字符。 字符是否可用取决于所选择的字体。如果当前字体中该字符不可用,则不会有任何显示。 示例 在屏幕上显示一个大写 “A” : GUI_DispChar('A'); 相关主题 GUI_DispChars()、 GUI_DispCharAt() GUI_DispCharAt() 描述 在当前窗口的指定位置处,使用当前字体显示单个字符。 原型 void GUI_DispCharAt(U16 c, I16P x, I16P y); 参数 c x y 描述 显示的字符。 要写入的客户端窗口 X 位置 (单位:像素)。 要写入的客户端窗口 Y 位置 (单位:像素)。 附加信息 所显示字符的左上角在指定的 (X,Y) 位置。 使用例程 GUI_DispChar() 写字符。 如果当前字体中该字符不可用,则不会有任何显示。 示例 在屏幕左上角显示一个大写 “A”: GUI_DispCharAt('A',0,0); 相关主题 GUI_DispChar()、 GUI_DispChars() emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 73 GUI_DispChars() 描述 在当前窗口的当前文本位置处,使用当前字体按指定次数显示字符。 原型 void GUI_DispChars(U16 c, int Cnt); 参数 c Cnt 显示的字符。 重复次数 (0 <= Cnt <= 32767)。 描述 其他信息 使用例程 GUI_DispChar() 写字符。 如果当前字体中该字符不可用,则不会有任何显示。 示例 在屏幕上显示 “******************************”: GUI_DispChars('*', 30); 相关主题 GUI_DispChar()、 GUI_DispCharAt() GUI_DispNextLine() 描述 将光标移至下一行的开始。 原型 void GUI_DispNextLine(void); 相关主题 GUI_SetLBorder() GUI_DispString() 描述 在当前窗口的当前文本位置处,使用当前字体显示作为参数的字符串。 原型 void GUI_DispString(const char GUI_FAR * s); 参数 s 显示的字符串。 描述 其他信息 字符串可以包括控制字符 “\n”。该控制字符把当前文本位置移至下一行的开始。 示例 在屏幕上显示 “Hello world”并在下一行显示 “Next line”: GUI_DispString("Hello world"); //Disp text GUI_DispString("\nNext line"); //Disp text 相关主题 GUI_DispStringAt()、 GUI_DispStringAtCEOL()、 GUI_DispStringLen() emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 74 章节 显示文本 GUI_DispStringAt() 描述 在当前窗口的指定位置处,使用当前字体显示作为参数的字符串。 原型 void GUI_DispStringAt(const char GUI_FAR * s, int x, int y); 参数 s x y 显示的字符串。 要写入的客户端窗口 X 位置 (单位:像素)。 要写入的客户端窗口 Y 位置 (单位:像素)。 描述 示例 在屏幕位置 (50,20) 处显示 “Position 50,20”: GUI_DispStringAt("Position 50,20", 50, 20); // Disp text 相关主题 GUI_DispString()、 GUI_DispStringAtCEOL()、 GUI_DispStringLen() GUI_DispStringAtCEOL() 描述 该例程使用的参数与 GUI_DispStringAt() 完全相同。它也执行同样的操作:在指定的位置显示所 给出的字符串。但是,完成此操作后,它会调用 GUI_DispCEOL() 例程清除本行剩下部分内容直至 行末。如果某个字符串要覆盖其他字符串,同时该字符串长度比原先的字符串要短,则使用该例程会 很方便。 GUI_DispStringHCenterAt() 描述 在当前窗口的指定位置处,使用当前字体水平居中显示作为参数的字符串。 原型 void GUI_DispStringHCenterAt(const char GUI_FAR * s, int x, int y); 参数 s x y 显示的字符串。 要写入的客户端窗口 X 位置 (单位:像素)。 要写入的客户端窗口 Y 位置 (单位:像素)。 描述 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 75 GUI_DispStringInRect() 描述 在当前窗口指定的矩形区域内的指定位置处,使用当前字体显示作为参数的字符串。 原型 void GUI_DispStringInRect(const char GUI_FAR * s, GUI_RECT * pRect, int Align); 参数 s pRect Align 描述 显示的字符串。 要写入的客户端窗口矩形区域 (单位:像素)。 对齐标记,可以通过 “OR”操作进行组合。垂直对齐和水平对齐标记应该组合使用。可用的标记有: 垂直对齐:GUI_TA_TOP、 GUI_TA_BOTTOM、 GUI_TA_VCENTER。 水平对齐:GUI_TA_LEFT、 GUI_TA_RIGHT、 GUI_TA_HCENTER。 示例 在当前窗口的水平和垂直居中位置显示字 “Text”: GUI_RECT rClient; GUI_GetClientRect(&rClient); GUI_DispStringInRect("Text", &rClient, GUI_TA_HCENTER | GUI_TA_VCENTER); 其他信息 如果指定的矩形区域太小,文本会被裁剪。 相关主题 GUI_DispString()、 GUI_DispStringAtCEOL()、 GUI_DispStringLen() emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 76 章节 显示文本 GUI_DispStringInRectEx() 描述 在当前窗口指定的矩形区域内的指定位置处,使用当前字体显示作为参数的字符串,并可旋转(可选)。 原型 void GUI_DispStringInRectEx(const char * s, GUI_RECT * pRect, int TextAlign, int MaxLen, const GUI_ROTATION * pLCD_Api); 参数 s pRect TextAlign MaxLen pLCD_Api 描述 显示的字符串。 要写入的客户端窗口矩形区域 (单位:像素)。 对齐标记,可以通过 “OR”操作进行组合。垂直对齐和水平对齐标记应该组合使用。可用的标记有: 垂直对齐:GUI_TA_TOP、 GUI_TA_BOTTOM、 GUI_TA_VCENTER。 水平对齐:GUI_TA_LEFT、 GUI_TA_RIGHT、 GUI_TA_HCENTER。 显示的最大字符数。 (参见下表) GUI_ROTATE_0 GUI_ROTATE_180 GUI_ROTATE_CCW GUI_ROTATE_CW 参数 pLCD_Api 的允许值 不旋转文本。从左到右显示。 180 度旋转文本。 逆时针旋转文本。 顺时针旋转文本。 示例 在指定的矩形区域内水平和垂直居中处显示字 “Text”: GUI_RECT Rect = {10, 10, 40, 80}; char acText[] = "Rotated\ntext"; GUI_SetTextMode(GUI_TM_XOR); GUI_FillRectEx(&Rect); GUI_DispStringInRectEx(acText, &Rect, GUI_TA_HCENTER | GUI_TA_VCENTER, strlen(acText), GUI_ROTATE_CCW); 上述示例的屏幕截图 其他信息 如果指定的矩形区域太小,文本会被裁剪。 为了让例程有效,配置开关 GUI_SUPPORT_ROTATION 必须激活 (默认)。 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 77 GUI_DispStringInRectWrap() 描述 在当前窗口指定的矩形区域内的指定位置处,使用当前字体显示字符串,并可自动换行 (可选)。 原型 void GUI_DispStringInRectWrap(const char GUI_UNI_PTR * s, GUI_RECT * pRect, int TextAlign, GUI_WRAPMODE WrapMode); 参数 s pRect TextAlign WrapMode 描述 显示的字符串。 要写入的客户端窗口矩形区域 (单位:像素)。 对齐标记,可以通过 “OR”操作进行组合。垂直对齐和水平对齐标记应该组合使用。可用的标记有: 垂直对齐:GUI_TA_TOP、 GUI_TA_BOTTOM、 GUI_TA_VCENTER。 水平对齐:GUI_TA_LEFT、 GUI_TA_RIGHT、 GUI_TA_HCENTER。 (参见下表) GUI_WRAPMODE_NONE GUI_WRAPMODE_WORD GUI_WRAPMODE_CHAR 参数 WrapMode 的允许值 不执行自动换行。 根据字对文本进行自动换行。 根据字符对文本进行自动换行。 其他信息 如需执行字换行,而指定的矩形区域又太小,则会对该字进行字符换行。 示例 在指定的矩形区域内水平和垂直居中处显示字 “Text”,并进行字换行: int i; char acText[] = "This example demonstrates text wrapping"; GUI_RECT Rect = {10, 10, 59, 59}; GUI_WRAPMODE aWm[] = {GUI_WRAPMODE_NONE, GUI_WRAPMODE_CHAR, GUI_WRAPMODE_WORD}; GUI_SetTextMode(GUI_TM_TRANS); for (i = 0; i < 3; i++) { GUI_SetColor(GUI_BLUE); GUI_FillRectEx(&Rect); GUI_SetColor(GUI_WHITE); GUI_DispStringInRectWrap(acText, &Rect, GUI_TA_LEFT, aWm[i]); Rect.x0 += 60; Rect.x1 += 60; } 上述示例的屏幕截图 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 78 章节 显示文本 GUI_DispStringLen() 描述 在当前窗口的当前文本位置处,使用当前字体按指定字符数显示作为参数的字符串。 原型 void GUI_DispStringLen(const char GUI_FAR * s, int Len); 参数 s Len 描述 显示的字符串。应该以 “\0”作为 8 位字符数组的结束标记。允许用 NULL 作为参数。 显示的字符数。 其他信息 如果字符串的字符数少于指定的数量 (短些),则用空格填满。 如果多于指定的数量 (长些),则实际仅会显示指定数量的字符。 文本消息可能以不同语言显示 (长度自然不同)时,该函数尤为有用,但仅有一定数量的字符可以 显示。 相关主题 GUI_DispString()、 GUI_DispStringAt()、 GUI_DispStringAtCEOL() GUI_WrapGetNumLines() 描述 返回设置自动换行模式的指定文本的行数。 原型 int GUI_WrapGetNumLines(const char GUI_UNI_PTR * pText, int xSize, GUI_WRAPMODE WrapMode); 参数 pText xSize WrapMode 描述 显示的字符串。应该以 “\0”作为 8 位字符数组的结束标记。允许用 NULL 作为参数。 X-size 用以绘制文本。 (参见下表) GUI_WRAPMODE_NONE GUI_WRAPMODE_WORD GUI_WRAPMODE_CHAR 参数 WrapMode 的允许值 不执行自动换行。 根据字对文本进行自动换行。 根据字符对文本进行自动换行。 其他信息 请记住,绘制文本所需的行数取决于当前所选的字体。 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 79 5.4 选择文本绘制模式 通常,在所选窗口的当前文本位置,使用所选字体以正常文本模式写入文本。正常文本模式意思是指 文本覆盖已经显示的任何内容,在这种情况下,字符掩码中设定的位元在屏幕上被设定。在这种模式 下,活动位元使用前景颜色写入,而非活动位元用背景颜色写入。但在某些情况下,需要更改这种默 认模式。 emWin 为此提供了四种可以组合使用的标记 (一种默认加三种修改标记): 正常文本 通过指定 GUI_TEXTMODE_NORMAL 或 0,可以正常显示文本。 反转文本 通过指定GUI_TEXTMODE_REV,可以反转显示文本。通常的黑底白字显示方式将变为白底黑字显示。 透明文本 通过指定 GUI_TEXTMODE_TRANS,可以显示为透明文本。透明文本表示文本写在屏幕上已经可见的 内容之上。不同之处在于,屏幕上原有的内容仍然可见,而在正常文本中,背景会替换为当前选择的 背景色。 异或文本 通过指定 GUI_TEXTMODE_XOR,可以使用异或模式显示文本。通常情况下,用白色绘制的 (实 际字符)显示是反相的。如果背景色是黑色,效果与默认模式 (正常文本)是一样的。如果背景是白 色,输出与反转文本一样。如果使用彩色,反相的像素由下式计算: 新像素颜色 = 颜色的值 – 实际像素颜色 –1。 透明反转文本 通过指定 GUI_TEXTMODE_TRANS | GUI_TEXTMODE_REV,可以显示为透明反转文本。与透明文 本一样,它不会覆盖背景,而且和反转文本一样,该文本会反转显示。 其他信息 请注意,还可以使用缩写形式:例如, GUI_TM_NORMAL 示例 显示正常、反转、透明、异或以及透明反转文本: GUI_SetFont(&GUI_Font8x16); GUI_SetBkColor(GUI_BLUE); GUI_Clear(); GUI_SetPenSize(10); GUI_SetColor(GUI_RED); GUI_DrawLine(80, 10, 240, 90); GUI_DrawLine(80, 90, 240, 10); GUI_SetBkColor(GUI_BLACK); GUI_SetColor(GUI_WHITE); GUI_SetTextMode(GUI_TM_NORMAL); GUI_DispStringHCenterAt("GUI_TM_NORMAL" , 160, 10); GUI_SetTextMode(GUI_TM_REV); GUI_DispStringHCenterAt("GUI_TM_REV" , 160, 26); GUI_SetTextMode(GUI_TM_TRANS); GUI_DispStringHCenterAt("GUI_TM_TRANS" , 160, 42); GUI_SetTextMode(GUI_TM_XOR); GUI_DispStringHCenterAt("GUI_TM_XOR" , 160, 58); GUI_SetTextMode(GUI_TM_TRANS | GUI_TM_REV); GUI_DispStringHCenterAt("GUI_TM_TRANS | GUI_TM_REV", 160, 74); emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 80 章节 上述示例的屏幕截图 显示文本 GUI_GetTextMode() 描述 返回当前选定的文本模式。 原型 int GUI_GetTextMode(void); 返回值 当前选定的文本模式。 GUI_SetTextMode() 描述 按照指定的参数设置文本模式。 原型 int GUI_SetTextMode(int TextMode); 参数 TextMode 描述 设置的文本模式,可以是 TEXTMODE 标记的任意组合。 参数 TextMode 的允许值 (可以通过 “OR”操作进行组合) GUI_TEXTMODE_NORMAL 设置为显示正常文本。这是默认设置,该数值等同于 0。 GUI_TEXTMODE_REV 设置为显示反转文本。 GUI_TEXTMODE_TRANS 设置为显示透明文本。 GUI_TEXTMODE_XOR 设置为反相显示的文本。 返回值 之前选定的文本模式。 示例 屏幕位置 (0,0) 处显示 “The value is”,以反转文本显示一个值,再将其设回正常模式: int i = 20; GUI_DispStringAt("The value is", 0, 0); GUI_SetTextMode(GUI_TEXTMODE_REV); GUI_DispDec(20, 3); GUI_SetTextMode(GUI_TEXTMODE_NORMAL); emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 81 GUI_SetTextStyle() 描述 按照指定的参数设置文本样式。 原型 char GUI_SetTextStyle(char Style); 参数 Style 设置的文本样式 (参见下表)。 描述 GUI_TS_NORMAL GUI_TS_UNDERLINE GUI_TS_STRIKETHRU GUI_TS_OVERLINE 返回值 之前选定的文本样式。 参数 Style 的允许值 显示正常文本 (默认)。 显示带下划线的文本。 显示带删除线的文本。 显示带顶线的文本。 5.5 选择文本对齐模式 GUI_GetTextAlign() 描述 返回当前文本对齐模式。 原型 int GUI_GetTextAlign(void); GUI_SetLBorder() 描述 设置当前窗口换行后的左边界。 原型 void GUI_SetLBorder(int x) 参数 x 描述 新的左边界 (单位:像素, 0 表示左边界)。 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 82 章节 显示文本 GUI_SetTextAlign() 描述 为当前窗口的字符串输出设置文本对齐模式。 原型 int GUI_SetTextAlign(int TextAlign); 参数 TextAlign 描述 设置的文本对齐模式,可以是水平和垂直对齐标记的组合。 参数 TextAlign 的允许值 (水平和垂直标记可以通过 “OR”操作进行组合) 水平对齐 GUI_TA_LEFT X 轴方向左对齐 (默认)。 GUI_TA_HCENTER X 轴方向居中。 GUI_TA_RIGHT X 轴方向右对齐。 垂直对齐 GUI_TA_TOP 在字符 Y 轴方向顶部对齐 (默认)。 GUI_TA_VCENTER Y 轴方向居中。 GUI_TA_BOTTOM 在字体 Y 轴底部像素线对齐。 返回值 所选的文本对齐模式。 其他信息 GUI_SetTextAllign() 不影响以 GUI_DispChar() 开始的字符输出例程。请注意,该例程的设 置仅对单一字符串有效。 示例 在位置 (100,100) 处显示数值 1234,采用居中模式: GUI_SetTextAlign(GUI_TA_HCENTER | GUI_TA_VCENTER); GUI_DispDecAt(1234,100,100,4); emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 83 5.6 设置当前文本位置 每个任务都有一个当前文本位置。该位置以窗口的原点 (通常是 (0,0))为参考,如果调用文本输出 例程,下一个字符就会写在该位置上。最初,该位置是 (0,0),即当前窗口的左上角。有三个函数可 以用于设置当前文本位置。 GUI_GotoXY(), GUI_GotoX(), GUI_GotoY() 描述 设置当前文本写入位置。 原型 char GUI_GotoXY(int x, int y); char GUI_GotoX(int x); char GUI_GotoY(int y); 参数 x y 描述 新的 X 轴位置 (单位:像素, 0 表示左边界)。 新的 Y 轴位置 (单位:像素, 0 表示顶部边界)。 返回值 通常为 0。 如果返回值 != 0,则当前文本位置超出窗口范围(到了右边或下方),这样后续的写入操作可能被忽略。 其他信息 GUI_GotoXY() 对当前文本位置的 X 和 Y 位置同时设置。 GUI_GotoX() 仅对当前文本位置的 X 位置进行设置, Y 位置保持不变。 GUI_GotoY() 仅对当前文本位置的 X 位置进行设置, X 位置保持不变。 示例 在屏幕位置 (20,20) 处显示 “(20,20)”: GUI_GotoXY(20,20) GUI_DispString("The value is"); emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 84 章节 5.7 返回当前文本位置 GUI_GetDispPosX() 描述 返回当前 X 位置。 原型 int GUI_GetDispPosX(void); GUI_GetDispPosY() 描述 返回当前 Y 位置。 原型 int GUI_GetDispPosY(void); 显示文本 5.8 清除窗口或部分窗口的例程 GUI_Clear() 描述 清除当前窗口。 原型 void GUI_Clear(void); 其他信息 如果没有定义窗口,则当前窗口为整个显示区。在这种情况下,整个显示区都会被清除。 示例 在屏幕上显示 “Hello world”,等待 1 秒种,然后清除显示内容: GUI_DispStringAt("Hello world", 0, 0); // Disp text GUI_Delay(1000); // Wait 1 second (not part of emWin) GUI_Clear(); // Clear screen GUI_DispCEOL() 描述 清除当前窗口 (或显示)从当前文本位置到行末的内容,高度为当前字体高度。 原型 void GUI_DispCEOL(void); 示例 在屏幕上显示“Hello world”,等待 1 秒钟,然后在同一位置处显示“Hi”,代替原先显示的字符串: GUI_DispStringAt("Hello world", 0, 0);// Disp text Delay (1000); GUI_DispStringAt("Hi", 0, 0); GUI_DispCEOL(); emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 85 第6章 显示数值 上一章节描述了如何在屏幕上显示字符串。当然,我们也可以使用字符串和标准 C 库的函数来显示数 值。然而,有时候这会是件困难的事。通常,较为容易 (也更为有效)的是调用一个例程显示所需结 构的数值。 emWin 支持各种十进制、十六进制和二进制输出。本章将对这些例程进行逐一描述。 所有函数不需要使用浮点库,并对速度和大小进行了优化。当然 “Sprintf”可以用于任何系统。使 用本章介绍的例程,有时可以简化操作,节省 ROM 空间和执行时间。 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 86 章节 显示数值 6.1 评估 API 下表按字母顺序列出了相应类别中与数值相关的可用例程。各例程将在后续章节中详细描述。 例程 描述 显示十进制数值 GUI_DispDec() 在当前位置显示指定字符数的十进制数值。 GUI_DispDecAt() 在指定位置显示指定字符数的十进制数值。 GUI_DispDecMin() 在当前位置显示最小字符数的十进制数值。 GUI_DispDecShift() GUI_DispDecSpace() 在当前位置显示指定字符数、带小数点的十进制长数值。 在当前位置显示指定字符数的十进制数值,用空格代替首位的 0。 GUI_DispSDec() 在当前位置显示指定字符数的十进制数值并显示符号。 GUI_DispSDecShift() 在当前位置显示指定字符数、带小数点的十进制长数值并显示符号。 显示浮点数值 GUI_DispFloat() 显示指定字符数的浮点数值。 GUI_DispFloatFix() 显示指定小数点右边位数的浮点数值。 GUI_DispFloatMin() 显示最小字符数的浮点数值。 GUI_DispSFloatFix() 显示指定小数点右边位数的浮点数值并显示符号。 GUI_DispSFloatMin() 显示最小字符数的浮点数值并显示符号。 显示二进制数值 GUI_DispBin() 在当前位置显示二进制数值。 GUI_DispBinAt() 在指定位置显示二进制数值。 显示十六进制数值 GUI_DispHex() 在当前位置显示十六进制数值。 GUI_DispHexAt() 在指定位置显示十六进制数值。 emWin 版 GUI_GetVersionString() 返回 emWin 的当前版本。 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 87 6.2 显示十进制数值 GUI_DispDec() 描述 在当前窗口的当前文本位置处,使用当前字体显示指定字符数的十进制数值。 原型 void GUI_DispDec(I32 v, U8 Len); 参数 V Len 显示的数值。 最小值为 -2147483648 (= -2^31)。 最大值为 2147483647 (= 2^31 -1)。 显示的位数 (最大为 10)。 描述 其他信息 支持首位为 0 的格式 (显示为 0)。 如果数值为负,则会显示一个负号。 示例 // Display time as minutes and seconds GUI_DispString("Min:"); GUI_DispDec(Min,2); GUI_DispString(" Sec:"); GUI_DispDec(Sec,2); 相关主题 GUI_DispSDec()、 GUI_DispDecAt()、 GUI_DispDecMin()、 GUI_DispDecSpace() GUI_DispDecAt() 描述 在当前窗口的指定位置处,使用当前字体显示指定字符数的十进制数值。 原型 void GUI_DispDecAt(I32 v, I16P x, I16P y, U8 Len); 参数 V x y Len 显示的数值。 最小值为 -2147483648 (= -2^31)。 最大值为 2147483647 (= 2^31 -1)。 要写入的客户端窗口 X 位置 (单位:像素)。 要写入的客户端窗口 Y 位置 (单位:像素)。 显示的位数 (最大为 10)。 描述 其他信息 支持首位为 0 的格式。 如果数值为负,则会显示一个负号。 示例 // Update seconds in upper right corner GUI_DispDecAT(Sec, 200, 0, 2); 相关主题 GUI_DispDec()、 GUI_DispSDec()、 GUI_DispDecMin()、 GUI_DispDecSpace() emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 88 章节 显示数值 GUI_DispDecMin() 描述 在当前窗口的当前文本位置处,使用当前字体显示十进制数值。不需要指定数值长度。会自动使用最 小长度值。 原型 void GUI_DispDecMin(I32 v); 参数 V 描述 显示的数值。 最小值:-2147483648 (= -2^31),最大值为 2147483647 (= 2^31 -1)。 其他信息 显示的最大位数为 10。如果数值必须对齐,但位数不一样,则不应该使用该函数。在这种情况下,应 该使用一个需要指定位数的函数。 示例 // Show result GUI_DispString("The result is :"); GUI_DispDecMin(Result); 相关主题 GUI_DispDec()、 GUI_DispDecAt()、 GUI_DispSDec()、 GUI_DispDecSpace() GUI_DispDecShift() 描述 在当前窗口的当前文本位置处,使用当前字体显示指定字符数的十进制长数值 (带小数点)。 原型 void GUI_DispDecShift(I32 v, U8 Len, U8 Shift); 参数 V Len Shift 描述 显示的数值。 最小值:-2147483648 (= -2^31),最大值:2147483647 (= 2^31 -1)。 显示的位数 (最大为 10)。 小数点右边显示的位数。 其他信息 注意:显示的最大字符数为 9 (包括符号和小数点)。 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 89 GUI_DispDecSpace() 描述 在当前窗口的当前文本位置处,使用当前字体显示十进制数值。不支持首位为 0 的格式(用空格替代)。 原型 void DispDecSpace(I32 v, U8 MaxDigits); 参数 V MaxDigits 描述 显示的数值。 最小值:-2147483648 (= -2^31),最大值:2147483647 (= 2^31 -1)。 显示的位数,包括首位空格。 显示的最大位数为 10 (不包括首位空格)。 其他信息 如果数值必须对齐,但数字位数不一样,使用该函数是一个不错的选择。 示例 // Show result GUI_DispString("The result is :"); GUI_DispDecSpace(Result, 200); 相关主题 GUI_DispDec()、 GUI_DispDecAt()、 GUI_DispSDec()、 GUI_DispDecMin() GUI_DispSDec() 描述 在当前窗口的当前文本位置处,使用当前字体显示指定字符数的十进制数值 (带符号)。 原型 void GUI_DispSDec(I32 v, U8 Len); 参数 V Len 描述 显示的数值。 最小值:-2147483648 (= -2^31),最大值:2147483647 (= 2^31 -1)。 显示的位数 (最大为 10)。 其他信息 支持首位为 0 的格式。 该函数与 GUI_DispDec 相似,但在数值的前面总显示符号,即使这个数值为正。 相关主题 GUI_DispDec()、 GUI_DispDecAt()、 GUI_DispDecMin()、 GUI_DispDecSpace() emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 90 章节 显示数值 GUI_DispSDecShift() 描述 在当前窗口的当前文本位置处,使用当前字体显示指定字符数的十进制长数值 (带符号和小数点)。 原型 void GUI_DispSDecShift(I32 v, U8 Len, U8 Shift); 参数 V Len Shift 描述 显示的数值。 最小值:-2147483648 (= -2^31),最大值:2147483647 (= 2^31 -1)。 显示的位数 (最大为 10)。 小数点右边显示的位数。 其他信息 数值前面总显示符号。 注意:显示的最大字符数为 9 (包括符号和小数点)。 示例 void DemoDec(void) { long l = 12345; GUI_Clear(); GUI_SetFont(&GUI_Font8x8); GUI_DispStringAt("GUI_DispDecShift:\n",0,0); GUI_DispSDecShift(l, 7, 3); GUI_SetFont(&GUI_Font6x8); GUI_DispStringAt("Press any key",0,GUI_VYSIZE-8); WaitKey(); } 上述示例的屏幕截图 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 91 6.3 显示浮点数值 GUI_DispFloat() 描述 在当前窗口的当前文本位置处,使用当前字体显示指定字符数的浮点数值。 原型 void GUI_DispFloat(float v, char Len); 参数 V Len 显示的数值。 最小值为 1.2 E-38,最大值为 3.4 E38。 显示的位数 (最大为 10)。 描述 其他信息 不支持首位为 0 的格式。小数点作为一个字符处理。 如果数值为负,则会显示一个负号。 示例 /* Shows all features for displaying floating point values */ void DemoFloat(void) { float f = 123.45678; GUI_Clear(); GUI_SetFont(&GUI_Font8x8); GUI_DispStringAt("GUI_DispFloat:\n",0,0); GUI_DispFloat (f,9); GUI_GotoX(100); GUI_DispFloat (-f,9); GUI_DispStringAt("GUI_DispFloatFix:\n",0,20); GUI_DispFloatFix (f,9,2); GUI_GotoX(100); GUI_DispFloatFix (f,9,2); GUI_DispStringAt("GUI_DispSFloatFix:\n",0,40); GUI_DispSFloatFix (f,9,2); GUI_GotoX(100); GUI_DispSFloatFix (-f,9,2); GUI_DispStringAt("GUI_DispFloatMin:\n",0,60); GUI_DispFloatMin (f,3); GUI_GotoX(100); GUI_DispFloatMin (-f,3); GUI_DispStringAt("GUI_DispSFloatMin:\n",0,80); GUI_DispSFloatMin (f,3); GUI_GotoX(100); GUI_DispSFloatMin (-f,3); GUI_SetFont(&GUI_Font6x8); GUI_DispStringAt("Press any key",0,GUI_VYSIZE-8); WaitKey(); } emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 92 章节 上述示例的屏幕截图 显示数值 GUI_DispFloatFix() 描述 在当前窗口的当前文本位置处,使用当前字体显示指定总字符数和小数点右边字符数的浮点数值。 原型 void GUI_DispFloatFix (float v, char Len, char Decs); 参数 V Len Decs 显示的数值。 最小值为 1.2 E-38,最大值为 3.4 E38。 显示的位数 (最大为 10)。 小数点右边显示的位数。 描述 其他信息 支持首位为 0 的格式。 如果数值为负,则会显示一个负号。 GUI_DispFloatMin() 描述 在当前窗口的当前文本位置处,使用当前字体显示小数点右边十进制数最少的浮点数值。 原型 void GUI_DispFloatMin(float f, char Fract); 参数 V Fract 显示的数值。 最小值为 1.2 E-38,最大值为 3.4 E38。 显示最少的字符数。 描述 其他信息 不支持首位为 0 的格式。 如果数值为负,则会显示一个负号。 不需要指定数值长度,会自动选择最小的长度值。如果数值必须对齐,但数字位数不一样,使用该函 数不是一个好的选择。可以尝试一个指定数字位数的函数。 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 93 GUI_DispSFloatFix() 描述 在当前窗口,使用当前字体显示指定总字符数和小数点右边字符数的浮点数值 (带符号)。 原型 void GUI_DispSFloatFix(float v, char Len, char Decs); 参数 V Len Decs 显示的数值。 最小值为 1.2 E-38,最大值为 3.4 E38。 显示的位数 (最大为 10)。 小数点右边显示的位数。 描述 其他信息 支持首位为 0 的格式。 数值前面总显示符号。 GUI_DispSFloatMin() 描述 在当前窗口的当前文本位置处,使用当前字体显示小数点右边十进制数最少的浮点数值 (带符号)。 原型 void GUI_DispSFloatMin(float f, char Fract); 参数 V Fract 显示的数值。 最小值为 1.2 E-38,最大值为 3.4 E38。 显示最少的位数。 描述 其他信息 不支持首位为 0 的格式。 数值前面总显示符号。 不需要指定数值长度,会自动选择最小的长度值。如果数值必须对齐,但数字位数不一样,使用该函 数不是一个好的选择。可以尝试一个指定数字位数的函数。 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 94 章节 6.4 显示二进制数值 GUI_DispBin() 描述 在当前窗口的当前文本位置处,使用当前字体显示二进制数值。 原型 void GUI_DispBin(U32 v, U8 Len); 参数 V Len 显示的数值, 32 位。 显示的数字位数 (包括首位的 0)。 描述 其他信息 与十进制和十六进制一样,最低有效位在最右边。 示例 // // Show binary value 7, result:000111 // U32 Input = 0x7; GUI_DispBin(Input, 6); 相关主题 GUI_DispBinAt() GUI_DispBinAt() 描述 在当前窗口的指定位置处,使用当前字体显示二进制数值。 原型 void DispBinAt(U32 v, I16P y, I16P x, U8 Len); 参数 V x y Len 显示的数值, 16 位。 要写入的客户端窗口 X 位置 (单位:像素)。 要写入的客户端窗口 Y 位置 (单位:像素)。 显示的数字位数 (包括首位的 0)。 描述 其他信息 与十进制和十六进制一样,最低有效位在最右边。 示例 // // Show binary input status // GUI_DispBinAt(Input, 0,0, 8); 相关主题 GUI_DispBin(), GUI_DispHex() 显示数值 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 95 6.5 显示十六进制数值 GUI_DispHex() 描述 在当前窗口的当前文本位置处,使用当前字体显示十六进制数值。 原型 void GUI_DispHex(U32 v, U8 Len); 参数 V Len 显示的数值, 16 位。 显示的数字位数。 其他信息 与十进制和二进制一样,最低有效位在最右边。 示例 描述 /* Show value of AD-converter */ GUI_DispHex(Input, 4); 相关主题 GUI_DispDec()、 GUI_DispBin()、 GUI_DispHexAt() GUI_DispHexAt() 描述 在当前窗口的指定位置处,使用当前字体显示十六进制数值。 原型 void GUI_DispHexAt(U32 v, I16P x, I16P y, U8 Len); 参数 V x y Len 显示的数值, 16 位。 要写入的客户端窗口 X 位置 (单位:像素)。 要写入的客户端窗口 Y 位置 (单位:像素)。 显示的数字位数。 描述 其他信息 与十进制和二进制一样,最低有效位在最右边。 示例 // // Show value of AD-converter at specified position // GUI_DispHexAt(Input, 0, 0, 4); 相关主题 GUI_DispDec()、 GUI_DispBin()、 GUI_DispHex() emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 96 章节 6.6 emWin 版 GUI_GetVersionString() 描述 返回一个包含 emWin 当前版本的字符串。 原型 const char * GUI_GetVersionString(void); 示例 // // Displays the current version at the current cursor position // GUI_DispString(GUI_GetVersionString()); 显示数值 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 97 第7章 2-D 图形库 emWin 包含完整的 2-D 图形库,可供大多数应用程序充分使用。 emWin 提供的例程的使用具有 (或没有)裁剪 (请参阅 “窗口管理器 (WM)”(第 289 页)),它们基于快速高效的算法。当前, 只有 GUI_DrawArc() 函数需要浮点计算。 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 98 章节 2-D 图形库 7.1 图形 API 下表按字母顺序列出了各自类别内可用的与图形相关的例程。有关详细描述,请参阅后面的章节。 例程 描述 GUI_GetPixelIndex() 返回给定位置的颜色指数。 绘制模式 GUI_GetDrawMode() GUI_SetDrawMode() 返回当前的绘制模式。 设置绘制模式。 画笔大小 GUI_GetPenSize() GUI_SetPenSize() 返回当前的画笔大小 (像素)。 设置画笔大小 (像素)。 查询当前客户区矩形 GUI_GetClientRect() GUI_ClearRect() GUI_CopyRect() GUI_DrawGradientH() GUI_DrawGradientV() GUI_DrawGradientRoundedH() GUI_DrawGradientRoundedV() GUI_DrawPixel() GUI_DrawPoint() GUI_DrawRect() GUI_DrawRectEx() GUI_DrawRoundedFrame() GUI_DrawRoundedRect() GUI_FillRect() GUI_FillRectEx() GUI_FillRoundedRect() GUI_InvertRect() 返回当前可用的绘制区域。 基本绘制例程 为矩形区域填充背景颜色。 复制显示器中的一个矩形区域。 绘制用水平颜色梯度填充的矩形。 绘制用垂直颜色梯度填充的矩形。 绘制用水平颜色梯度填充的圆角矩形。 绘制用垂直颜色梯度填充的圆角矩形。 绘制单个像素。 绘制点。 绘制矩形。 绘制矩形。 绘制圆角框。 绘制圆角矩形。 绘制填充的矩形。 绘制填充的矩形。 绘制填充的圆角矩形。 倒转矩形区域。 Alpha 混合 GUI_EnableAlpha() GUI_RestoreUserAlpha() GUI_SetAlpha() GUI_SetUserAlpha() GUI_DrawBitmap() GUI_DrawBitmapEx() GUI_DrawBitmapHWAlpha() GUI_DrawBitmapMag() 启用 / 禁用自动 Alpha 混合。 恢复之前的用户 Alpha 混合状态。 设置当前的 Alpha 混合值。(弃用)。 设置其他值,以用于计算要使用的实际 Alpha 混合值。 绘制位图 绘制位图。 绘制缩放的位图。 在具有硬件 Alpha 混合支持的系统上绘制带 Alpha 混合 信息的位图。 绘制放大的位图。 绘制流位图 GUI_CreateBitmapFromStream() GUI_CreateBitmapFromStreamIDX() GUI_CreateBitmapFromStreamRLE4() GUI_CreateBitmapFromStreamRLE8() GUI_CreateBitmapFromStream565() GUI_CreateBitmapFromStreamM565() GUI_CreateBitmapFromStream555() GUI_CreateBitmapFromStreamM555() GUI_CreateBitmapFromStreamRLE16() GUI_CreateBitmapFromStreamRLEM16() 基于给定的任何类型的流创建位图。 根据基于指数的位图流创建位图。 基于 RLE4 位图流创建位图。 基于 RLE8 位图流创建位图。 基于 16 位位图流创建位图。 基于红色和蓝色交换的 16 位位图流创建位图。 基于 15 位位图流创建位图。 基于红色和蓝色交换的 15 位位图流创建位图。 基于 RLE16 位图流创建位图。 基于红色和蓝色交换的 RLE16 位图流创建位图。 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 99 例程 描述 GUI_CreateBitmapFromStream24() 基于 24 位位图流创建位图。 GUI_CreateBitmapFromStreamAlpha() 基于 32 位位图流创建位图。 GUI_CreateBitmapFromStreamRLEAlpha() 基于 RLE 压缩的 8 位 Alpha 位图流创建位图。 GUI_CreateBitmapFromStreamRLE32() 基于 RLE32 位图流创建位图。 GUI_DrawStreamedBitmap() 绘制位图流。 GUI_DrawStreamedBitmapEx() 绘制位图流,而不加载完整的图像。 GUI_GetStreamedBitmapInfo() 返回有关给定流的信息。 GUI_GetStreamedBitmapInfoEx() 返回有关可能位于任何媒介的给定流的信息。 GUI_SetStreamedBitmapHook() 为 GUI_DrawStreamedBitmapEx() 设置挂钩函数。 绘制线条 GUI_DrawHLine() GUI_DrawLine() GUI_DrawLineRel() GUI_DrawLineTo() GUI_DrawPolyLine() GUI_DrawVLine() GUI_GetLineStyle() GUI_MoveRel() GUI_MoveTo() GUI_SetLineStyle() 绘制水平线。 绘制从某个指定起点到指定终点的线条 (绝对坐标)。 绘制从当前位置到按 X 和 Y 距离指定的终点的线条 (相 对坐标)。 绘制从当前位置到指定终点的线条。 绘制折线。 绘制垂直线。 返回当前的线条样式。 相对于其当前位置移动线条指针。 将线条指针移动到给定位置。 设置当前的线条样式。 绘制多边形 GUI_DrawPolygon() GUI_EnlargePolygon() GUI_FillPolygon() GUI_MagnifyPolygon() GUI_RotatePolygon() 绘制多边形的轮廓。 扩展多边形。 绘制填充的多边形。 放大多边形。 按指定角度旋转多边形。 绘制圆 GUI_DrawCircle() GUI_FillCircle() 绘制圆的轮廓。 绘制填充的圆。 绘制椭圆 GUI_DrawEllipse() GUI_FillEllipse() 绘制椭圆的轮廓。 绘制填充的椭圆。 绘制弧线 GUI_DrawArc() 绘制弧线。 绘制线图 GUI_DrawGraph() 绘制线图。 绘制饼图 GUI_DrawPie() 绘制圆形扇区。 保存和恢复 GUI 环境 GUI_RestoreContext() GUI_SaveContext() 恢复 GUI 环境。 保存 GUI 环境。 裁剪 GUI_SetClipRect() 设置用于裁剪的矩形。 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 100 章节 GUI_GetPixelIndex() 描述 返回给定位置的颜色指数。 原型 unsigned GUI_GetPixelIndex(int x, int y); 参数 x y 像素的绝对 x 位置 像素的绝对 y 位置 描述 2-D 图形库 7.2 绘制模式 emWin 可在 NORMAL 或 XOR 模式中进行绘制。默认为 NORMAL 模式,在该模式下,显示的内容 将被超量绘制。在 XOR 模式中,超量绘制时显示的内容方向将倒转。 GUI_DRAWMODE_XOR 相关的限制 • XOR 模式仅在活动窗口或屏幕内使用两种显示颜色时比较有用。 • emWin 的部分绘制函数在此绘制模式下无法正确运行。一般而言,此模式仅适用于一像素的画 笔大小。这意味着,在 XOR 模式下运行时,使用 GUI_DrawLine()、 GUI_DrawCircle()、 GUI_DrawRect() 等函数之前,必须确保画笔大小设置为 “1”。 • 使用大于 1 位 / 像素 (bpp) 的色深绘制位图时,此绘制模式则不起作用。 • 使用 GUI_DrawPolyLine() 等绘制函数或多次调用 GUI_DrawLineTo() 时,支点将进行两 次倒转。其结果是这些像素依然留在背景颜色中。 GUI_GetDrawMode() 描述 返回当前的绘制模式。 原型 GUI_DRAWMODE GUI_GetDrawMode(void); 返回值 当前选择的绘制模式。 其他信息 有关绘制模式的详情,请参阅 “GUI_GetDrawMode()”(第 100 页)函数。 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 101 GUI_SetDrawMode() 描述 选择指定的绘制模式。 原型 GUI_DRAWMODE GUI_SetDrawMode(GUI_DRAWMODE mode); 参数 mode 描述 要设置的绘制模式。可能是任何例程返回的值,该例程设置绘制模式或以下常数之一。 GUI_DM_NORMAL GUI_DM_XOR 参数 mode 的允许值 默认:绘制点、线、区域、位图。 在显示器中重写其他对象的颜色时倒转点、线、区域。 返回值 所选的绘制模式。 其他信息 除设置绘制模式外,此例程还可用于恢复之前更改的绘制模式。 如果使用颜色,倒转的像素的计算方式如下: 新像素颜色 = 颜色的值 – 实际像素颜色 –1。 示例 // // Showing two circles, the second one XOR-combined with the first: // GUI_Clear(); GUI_SetDrawMode(GUI_DRAWMODE_NORMAL); GUI_FillCircle(120, 64, 40); GUI_SetDrawMode(GUI_DRAWMODE_XOR); GUI_FillCircle(140, 84, 40); 上述示例的屏幕截图 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 102 章节 2-D 图形库 7.3 查询当前客户区矩形 GUI_GetClientRect() 描述 当 前 的 客 户 区 矩 形 取 决 于 是 否 在 使 用 窗 口 管 理 器。如 果 正 在 使 用 窗 口 管 理 器,则 可 使 用 函 数 WM_GetClientRect 来检索客户区矩形。如果未使用窗口管理器,则客户区矩形与整个 LCD 显示器 相对应。 原型 void GUI_GetClientRect(GUI_RECT * pRect); 参数 pRect 指向存储结果的 GUI_RECT-structure。 描述 7.4 画笔大小 画笔大小决定以下矢量绘制操作的厚度: • GUI_DrawPoint() • GUI_DrawLine() • GUI_DrawLineRel() • GUI_DrawLineTo() • GUI_DrawPolyLine() • GUI_DrawPolygon() • GUI_DrawEllipse() • GUI_DrawArc() 请注意,无法合并画笔大小 >1 的线条样式。 GUI_GetPenSize() 描述 返回当前的画笔大小。 原型 U8 GUI_GetPenSize(void); GUI_SetPenSize() 描述 设置用于更多绘制操作的画笔大小。 原型 U8 GUI_SetPenSize(U8 PenSize); 参数 PenSize 使用的画笔大小 (单位:像素)。 返回值 之前的画笔大小。 附加信息 画笔大小应 >= 1。 描述 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 103 7.5 基本绘制例程 基本绘制例程可以在显示器中的任意位置绘制单个点、水平线和垂直线以及图形。所有可用的绘制模 式均能使用。由于大多数应用程序会频繁调用这些例程,因此对它们的速度尽可能进行了优化。例如, 水平线和垂直线函数不需要使用单点例程。 GUI_ClearRect() 描述 通过为矩形区域填充背景颜色,清除当前窗口中指定位置的矩形区域。 原型 void GUI_ClearRect(int x0, int y0, int x1, int y1); 参数 x0 y0 x1 y1 左上角 X 位置。 左上角 Y 位置。 右下角 X 位置。 右下角 Y 位置。 描述 相关主题 GUI_InvertRect()、 GUI_FillRect() GUI_CopyRect() 描述 将给定矩形区域的内容复制到指定位置。 原型 void GUI_CopyRect(int x0, int y0, int x1, int y1, int xSize, int ySize); 参数 x0 y0 x1 y1 xSize ySize 源矩形的左上角 X 位置。 源矩形的左上角 Y 位置。 目标矩形的左上角 X 位置。 目标矩形的左上角 Y 位置。 矩形的 X 大小。 矩形的 Y 大小。 描述 其他信息 源矩形和目标矩形可能会彼此重叠。 GUI_DrawGradientH() 描述 绘制用水平颜色梯度填充的矩形。 原型 void GUI_DrawGradientH(int x0, int y0, int x1, int y1, emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 104 章节 GUI_COLOR Color0, GUI_COLOR Color1); 参数 x0 y0 x1 y1 Color0 Color1 左上角 X 位置。 左上角 Y 位置。 右下角 X 位置。 右下角 Y 位置。 矩形最左侧要绘制的颜色。 矩形最右侧要绘制的颜色。 描述 示例 GUI_DrawGradientH(0, 0, 99, 99, 0x0000FF, 0x00FFFF); 上述示例的屏幕截图 2-D 图形库 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 105 GUI_DrawGradientV() 描述 绘制用垂直颜色梯度填充的矩形。 原型 void GUI_DrawGradientV(int x0, int y0, int x1, int y1, GUI_COLOR Color0, GUI_COLOR Color1); 参数 x0 y0 x1 y1 Color0 Color1 左上角 X 位置。 左上角 Y 位置。 右下角 X 位置。 右下角 Y 位置。 矩形最顶端要绘制的颜色。 矩形最底端要绘制的颜色。 描述 示例 GUI_DrawGradientV(0, 0, 99, 99, 0x0000FF, 0x00FFFF); 上述示例的屏幕截图 GUI_DrawGradientRoundedH() 描述 绘制用水平颜色梯度填充的圆角矩形。 原型 void GUI_DrawGradientRoundedH(int x0, int y0, int x1, int y1, int rd GUI_COLOR Color0, GUI_COLOR Color1); 参数 x0 y0 x1 y1 rd Color0 Color1 左上角 X 位置。 左上角 Y 位置。 右下角 X 位置。 右下角 Y 位置。 矩形最左侧要绘制的颜色。 矩形最右侧要绘制的颜色。 描述 示例 GUI_DrawGradientRoundedH(0, 0, 上述示例的屏幕截图 99, 99, 25, 0x0000FF, 0x00FFFF); emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 106 章节 2-D 图形库 GUI_DrawGradientRoundedV() 描述 绘制用垂直颜色梯度填充的圆角矩形。 原型 void GUI_DrawGradientRoundedV(int x0, int y0, int x1, int y1, GUI_COLOR Color0, GUI_COLOR Color1); 参数 x0 y0 x1 y1 Color0 Color1 左上角 X 位置。 左上角 Y 位置。 右下角 X 位置。 右下角 Y 位置。 矩形最左侧要绘制的颜色。 矩形最右侧要绘制的颜色。 描述 示例 GUI_DrawGradientRoundedV(0, 0, 99, 99, 25, 0x0000FF, 0x00FFFF); 上述示例的屏幕截图 GUI_DrawPixel() 描述 在当前窗口中的指定位置绘制像素。 原型 void GUI_DrawPixel(int x, int y); 参数 x y 像素的 X 位置。 像素的 Y 位置。 相关主题 GUI_DrawPoint() GUI_DrawPoint() 描述 在当前窗口中的指定位置以当前画笔大小绘制点。 原型 void GUI_DrawPoint(int x, int y); 参数 x y 点的 X 位置。 点的 Y 位置。 相关主题 GUI_DrawPixel() 描述 描述 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 107 GUI_DrawRect() 描述 在当前窗口中的指定位置绘制矩形。 原型 void GUI_DrawRect(int x0, int y0, int x1, int y1); 参数 x0 y0 x1 y1 左上角 X 位置。 左上角 Y 位置。 右下角 X 位置。 右下角 Y 位置。 描述 GUI_DrawRectEx() 描述 在当前窗口中的指定位置绘制矩形。 原型 void GUI_DrawRectEx(const GUI_RECT * pRect); 参数 pRect 指向包含矩形坐标的 GUI_RECT-structure 描述 GUI_DrawRoundedFrame() 描述 在当前窗口中的指定位置绘制指定宽度的圆角框。 原型 void GUI_DrawRoundedFrame(int x0, int y0, int x1, int y1, int r, int w); 参数 x0 y0 x1 y1 r w 左上角 X 位置。 左上角 Y 位置。 右下角 X 位置。 右下角 Y 位置。 圆角使用的半径。 框的绘制宽度。 描述 GUI_DrawRoundedRect() 描述 在当前窗口中的指定位置绘制圆角矩形。 原型 void GUI_DrawRoundedRect(int x0, int y0, int x1, int y1, int r); 参数 x0 y0 x1 y1 r 左上角 X 位置。 左上角 Y 位置。 右下角 X 位置。 右下角 Y 位置。 圆角使用的半径。 描述 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 108 章节 GUI_FillRect() 描述 在当前窗口中的指定位置绘制填充的矩形区域。 原型 void GUI_FillRect(int x0, int y0, int x1, int y1); 参数 x0 y0 x1 y1 左上角 X 位置。 左上角 Y 位置。 右下角 X 位置。 右下角 Y 位置。 描述 其他信息 使用当前的绘制模式,通常意味着矩形内的所有像素均已设置。 相关主题 GUI_InvertRect()、 GUI_ClearRect() GUI_FillRectEx() 描述 在当前窗口中的指定位置绘制填充的矩形。 原型 void GUI_FillRectEx(const GUI_RECT * pRect); 参数 pRect 指向包含矩形坐标的 GUI_RECT-structure 描述 GUI_FillRoundedRect() 描述 在当前窗口中的指定位置绘制填充的圆角矩形。 原型 void GUI_FillRoundedRect(int x0, int y0, int x1, int y1, int r); 参数 x0 y0 x1 y1 r 左上角 X 位置。 左上角 Y 位置。 右下角 X 位置。 右下角 Y 位置。 圆角使用的半径。 描述 2-D 图形库 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 109 GUI_InvertRect() 描述 在当前窗口中的指定位置绘制倒转的矩形区域。 原型 void GUI_InvertRect(int x0, int y0, int x1, int y1); 参数 x0 y0 x1 y1 左上角 X 位置。 左上角 Y 位置。 右下角 X 位置。 右下角 Y 位置。 相关主题 GUI_FillRect()、 GUI_ClearRect() 描述 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 110 章节 2-D 图形库 7.6 Alpha 混合 Alpha 混合是一种合并前景图像与背景来创建半透明效果的方法。Alpha 值决定可见的像素数以及背 景透露的像素数。 颜色信息 emWin 内部适用于 32 位的颜色信息: • 0-7 位:红色 • 8-15 位:绿色 • 16-23 位:蓝色 • 24-31 位:Alpha 信息 Alpha 值为 0 表示不透明,值为 255 表示完全透明。 工作原理 Alpha 混合完全自动执行。唯一需要做的就是使用 GUI_EnableAlpha() 启用 Alpha 混合。在此, 8 位以上的颜色信息将作为 Alpha 值管理。 示例 下面的小示例显示了它的工作原理: GUI_EnableAlpha(1); GUI_SetBkColor(GUI_WHITE); GUI_Clear(); GUI_SetColor(GUI_BLACK); GUI_DispStringHCenterAt("Alphablending", 45, 41); GUI_SetColor((0x40uL << 24) | GUI_RED); GUI_FillRect(0, 0, 49, 49); GUI_SetColor((0x80uL << 24) | GUI_GREEN); GUI_FillRect(20, 20, 69, 69); GUI_SetColor((0xC0uL << 24) | GUI_BLUE); GUI_FillRect(40, 40, 89, 89); 旧版本 在旧版本中,需要使用函数 GUI_SetAlpha() 来混合前景与当前的背景颜色信息。现在依然有用, 但不再是必需的。 GUI_EnableAlpha() 描述 启用或禁用自动 Alpha 混合。 原型 unsigned GUI_EnableAlpha(unsigned OnOff); 参数 OnOff 1 表示启用自动 Alpha 混合, 0 表示禁用。 描述 返回值 旧状态。 其他信息 启用自动 Alpha 混合后,每个对象的颜色信息将自动决定其透明度。 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 111 GUI_SetAlpha() (弃用) 描述 为所有后续绘制操作启用软件 Alpha 混合。 原型 unsigned GUI_SetAlpha(U8 Value); 参数 Alpha 描述 用于所有后续绘制操作的 Alpha 值。默认为 0,表示无 Alpha 混合。 返回值 Alpha 混合之前使用的值。 其他信息 该函数设置用于所有后续绘制操作的 Alpha 值。参数 Alpha 值为 0 表示不透明(禁用 Alpha 混合), 值为 255 表示完全透明 (不可见)。 请注意,软件 Alpha 混合会增加 CPU 负荷。此外,强烈建议在绘制操作完成后,将 Alpha 值设回默 认值。 示例 extern const GUI_BITMAP _LogoBitmap; GUI_SetColor(GUI_BLUE); GUI_FillCircle(100, 50, 49); GUI_SetColor(GUI_YELLOW); for (i = 0; i < 100; i++) { U8 Alpha; Alpha = (i * 255 / 100); GUI_SetAlpha(Alpha); GUI_DrawHLine(i, 100 - i, 100 + i); } GUI_SetAlpha(0x80); GUI_DrawBitmap(&_LogoBitmap, 30, 30); GUI_SetColor(GUI_MAGENTA); GUI_SetFont(&GUI_Font24B_ASCII); GUI_SetTextMode(GUI_TM_TRANS); GUI_DispStringHCenterAt("Alphablending", 100, 3); GUI_SetAlpha(0); /* Set back to default (opaque) */ 上述示例的屏幕截图 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 112 章节 2-D 图形库 GUI_SetUserAlpha() 描述 设置其他值以用于计算要使用的实际 Alpha 值。 实际 Alpha 值的计算方式如下: Alpha = AlphaFromObject + ((255 - AlphaFromObject) * UserAlpha) / 255 原型 U32 GUI_SetUserAlpha(GUI_ALPHA_STATE * pAlphaState, U32 UserAlpha); 参数 pAlphaState UserAlpha 描述 指向用于保存当前状态的 GUI_ALPHA_STATE 结构。 要使用的值。 返回值 之前的用户 Alpha 值。 其他信息 以下函数 GUI_RestoreUserAlpha() 可用于恢复函数之前的状态。 GUI_RestoreUserAlpha() 描述 恢复用户 Alpha 混合之前的状态。保存在所指向的结构中。 原型 U32 GUI_RestoreUserAlpha(GUI_ALPHA_STATE * pAlphaState); 参数 pAlphaState 描述 指向包含要恢复的之前状态信息的 GUI_ALPHA_STATE 结构。 返回值 当前的用户 Alpha 值。 示例 { GUI_ALPHA_STATE AlphaState; GUI_EnableAlpha(1); GUI_SetBkColor(GUI_WHITE); GUI_Clear(); GUI_SetColor(GUI_BLACK); GUI_DispStringHCenterAt("Alphablending", 45, 41); GUI_SetUserAlpha(&AlphaState, 0xC0); GUI_SetColor(GUI_RED); GUI_FillRect(0, 0, 49, 49); GUI_SetColor(GUI_GREEN); GUI_FillRect(20, 20, 69, 69); GUI_SetColor(GUI_BLUE); GUI_FillRect(40, 40, 89, 89); GUI_RestoreUserAlpha(&AlphaState); } emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 113 7.7 绘制位图 一般而言, emWin 能够在任何显示器位置显示所有位图图像。在 16 位 CPU(sizeof(int) == 2) 中,默认一个位图的大小限制为 64 kb。如果需要使用 16 位 CPU 显示更大的位置,请参阅“配置” (第 905 页)。 GUI_DrawBitmap() 描述 在当前窗口中的指定位置绘制位图图像。 原型 void GUI_DrawBitmap(const GUI_BITMAP * pBM, int x, int y); 参数 pBM x y 指向要显示的位图。 显示器中位图左上角的 X 位置。 显示器中位图左上角的 Y 位置。 描述 其他信息 图片数据的解释为从第一个字节的最高有效位 (msb) 开始的位流。 新行始终在偶数字节地址开始,就像位图的第 n 行从偏移 n*BytesPerLine 开始。在客户区的任何 位置都能看到位图。 通常,使用位图转换器生成位图。更多详细信息,请参阅 “位图转换器”(第 213 页)。 示例 extern const GUI_BITMAP bmSeggerLogoBlue; /* declare external Bitmap */ void main() { GUI_Init(); GUI_DrawBitmap(&bmSeggerLogoBlue, 45, 20); } 上述示例的屏幕截图 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 114 章节 2-D 图形库 GUI_DrawBitmapEx() 描述 此例程可以在显示器中缩放和 / 或镜像位图。 原型 void GUI_DrawBitmapEx(const GUI_BITMAP * pBitmap, int x0, int y0, int xCenter, int yCenter, int xMag, int yMag); 参数 pBM x0 y0 xCenter yCenter xMag yMag 指向要显示的位图。 显示器中定位点的 X 位置。 显示器中定位点的 Y 位置。 位图中定位点的 X 位置。 位图中定位点的 Y 位置。 X 方向的比例因子。 Y 方向的比例因子。 描述 其他信息 xMag 参数为负值将在 X 轴镜像位图,yMag 参数为负值将在 Y 轴镜像位图。xMag 和 yMag 的单位为 千分之一。 xCenter 和 yCenter 给定的位置指定在显示器中 x0/y0 位置 (不考虑比例或镜像)显 示的位图的像素。 不能使用此函数绘制 RLE 压缩的位图。 GUI_DrawBitmapHWAlpha() 描述 在具有硬件 Alpha 混合支持的多层系统上绘制带 Alpha 信息的位图。 原型 void GUI_DrawBitmapHWAlpha(const GUI_BITMAP GUI_UNI_PTR * pBM, int x0, int y0); 参数 pBM x0 y0 指向要显示的位图。 显示器中位图左上角的 X 位置。 显示器中位图左上角的 Y 位置。 描述 其他信息 在 emWin 中,逻辑颜色作为 32 位值处理。较低的 24 位用于颜色信息,较高的 8 位用于管理 Alpha 值。 Alpha 值为 0 表示图像不透明,值为 0xFF 表示完全透明 (不可见)。 在硬件支持 Alpha 混合的系统上,需要将 Alpha 值写入执行 Alpha 混合的显示控制器中。 通常,硬件的 Alpha 格式与上述 emWin 中的 Alpha 定义不同。大多情况下,值为 0 表示完全透明, 值越高表示像素可见度越高。 因此,大多数情况下,需要定制颜色转换例程将逻辑颜色转换为所需的硬件格式。“样本”文件夹中 包含 ALPHA_DrawBitmapHWAlpha 示例,它显示了如何考虑定制颜色转换的要求。 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 115 GUI_DrawBitmapMag() 描述 此例程可以放大显示器中的位图。 原型 void GUI_DrawBitmapMag(const GUI_BITMAP * pBM, int x0, int y0, int XMul, int YMul); 参数 pBM x0 y0 XMul YMul 指向要显示的位图。 显示器中位图左上角的 X 位置。 显示器中位图左上角的 Y 位置。 X 方向的放大系数。 Y 方向的放大系数。 描述 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 116 章节 2-D 图形库 7.8 绘制流位图 与 C 文件格式的位图相反,流位图可放在任何位置。位图流可用于创建位图。这些位图可按与 C 文件 格式位图相同的方式使用。此外, emWin 支持直接绘制基于调色板的位图流,而不必在可寻址区域 (RAM 或 ROM)放置完整的图像。 GUI_CreateBitmapFromStream() 描述 该函数通过传输任何类型的位图流创建位图结构。 原型 int GUI_CreateBitmapFromStream(GUI_BITMAP * pBMP, GUI_LOGPALETTE * pPAL, const void * p); 参数 pBMP pPAL p 描述 指向该函数初始化的 GUI_BITMAP 结构。 指向该函数初始化的 GUI_LOGPALETTE 结构。 指向数据流。 返回值 0 表示成功, 1 表示错误。 其他信息 如果数据流可能包含多种位图格式或未知,应使用此函数。使用此函数的缺点在于它占用很大的存储 器空间。如果需要顾虑存储器使用量 (ROM),则最好使用以下特定格式的函数。 GUI_CreateBitmapFromStreamIDX(), GUI_CreateBitmapFromStreamRLE4(), GUI_CreateBitmapFromStreamRLE8(), GUI_CreateBitmapFromStream565(), GUI_CreateBitmapFromStreamM565(), GUI_CreateBitmapFromStream555(), GUI_CreateBitmapFromStreamM555(), GUI_CreateBitmapFromStreamRLE16(), GUI_CreateBitmapFromStreamRLEM16(), GUI_CreateBitmapFromStream24(), GUI_CreateBitmapFromStreamAlpha(), GUI_CreateBitmapFromStreamRLEAlpha(), GUI_CreateBitmapFromStreamRLE32() 描述 这些函数可通过传输已知格式的位图流,创建位图结构。 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 117 原型 int GUI_CreateBitmapFromStream(GUI_BITMAP * pBMP, GUI_LOGPALETTE * pPAL, const void * p); 参数 pBMP pPAL p 描述 指向该函数初始化的 GUI_BITMAP 结构。 指向该函数初始化的 GUI_LOGPALETTE 结构。 指向数据流。 支持的数据流格式 下表显示了每个函数支持的数据流格式: 函数 支持的数据流格式 GUI_CreateBitmapFromStreamIDX() GUI_CreateBitmapFromStreamRLE4() GUI_CreateBitmapFromStreamRLE8() GUI_CreateBitmapFromStream565() GUI_CreateBitmapFromStreamM565() GUI_CreateBitmapFromStream555() GUI_CreateBitmapFromStreamM555() GUI_CreateBitmapFromStreamRLE16() GUI_CreateBitmapFromStreamRLEM16() GUI_CreateBitmapFromStream24() GUI_CreateBitmapFromStreamAlpha() GUI_CreateBitmapFromStreamRLEAlpha() GUI_CreateBitmapFromStreamRLE32() 基于指数的位图流。 RLE4 压缩的位图流。 RLE8 压缩的位图流。 高色彩位图流 (565)。 高色彩位图流 (M565)。 高色彩位图流 (555)。 高色彩位图流 (M565)。 RLE16 压缩的位图流。 RLE16 压缩的位图流,红色和蓝色交换。 24 bpp 位图流 (真彩色)。 32 bpp 位图流 (真彩色,带 Alpha 通道)。 RLE 压缩的 8 bpp Alpha 位图流。 RLE32 压缩的位图流 (真彩色,带 Alpha 通道)。 返回值 0 表示成功, 1 表示错误。 其他信息 如果数据流包含已知的格式,则应使用这些函数。这样,可避免链接未用的代码并使二进制编码较小。 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 118 章节 2-D 图形库 GUI_DrawStreamedBitmap() 描述 基于数据位图数据流绘制位图。 原型 void GUI_DrawStreamedBitmap(const void * p, int x, int y); 参数 p x y 指向数据流。 显示器中位图左上角的 X 位置。 显示器中位图左上角的 Y 位置。 描述 其他信息 您可以使用位图转换器 (见 “位图转换器”(第 213 页))来创建位图数据流。这些流的格式与 bmp 文件的格式不相同。 GUI_DrawStreamedBitmapEx() 描述 如果没有足够的 RAM 或 ROM 来保存可寻址存储器 (RAM 或 ROM)内的整个文件,可使用此函数 来绘制数据流。图形用户界面 (GUI) 库将调用参数 pfGetData 所指向的函数来读取数据。GetData 函数需要返回请求的字节数。 GUI 请求的最大字节数为绘制一行图像所需的字节数。 原型 int GUI_DrawStreamedBitmapEx(GUI_GET_DATA_FUNC * pfGetData, const void * p, int x, int y); 参数 pfGetData p x y 描述 指向获取数据调用的函数。有关 GetData 函数的详细信息,请参阅“使用 ...Ex() 函数获取数据”(第 167 页)。 传递到 pfGetData 所指函数的 Void 指针。 显示器中位图左上角的 X 位置。 显示器中位图左上角的 Y 位置。 返回值 0 表示成功, 1 表示错误。 其他信息 另请参阅函数 GUI_SetStreamedBitmapHook()。 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 119 GUI_GetStreamedBitmapInfo() 描述 返回附带给定数据流相关信息的结构。 原型 void GUI_GetStreamedBitmapInfo(const void * p, GUI_BITMAPSTREAM_INFO * pInfo); 参数 p pInfo 描述 指向数据流。 指向由该函数填充的 GUI_BITMAPSTREAM_INFO 结构。 GUI_BITMAPSTREAM_INFO 的元素 数据类型 int int int int int 元素 描述 XSize 图像的 X 像素大小。 YSize 图像的 Y 像素大小。 BitsPerPixel 每像素的位数。 NumColors 基于指数的图像的颜色数。 HasTrans 对于基于指数的图像, 1 表示存在透明度, 0 表示不存在。 GUI_GetStreamedBitmapInfoEx() 描述 返回附带给定数据流相关信息的结构,该数据流无需位于 CPU 的可寻址 ROM 或 RAM 中。 原型 int GUI_GetStreamedBitmapInfoEx(GUI_GET_DATA_FUNC * pfGetData, const void * p, GUI_BITMAPSTREAM_INFO * pInfo); 参数 pfGetData p pInfo 描述 指向获取数据调用的函数。有关 GetData 函数的详细信息,请参阅“使用 ...Ex() 函数获取数据”(第 167 页)。 传递到 pfGetData 所指函数的 Void 指针。 指向由该函数填充的 GUI_BITMAPSTREAM_INFO 结构。 返回值 0 表示成功, 1 表示错误。 GUI_BITMAPSTREAM_INFO 的元素 请参阅 GUI_GetStreamedBitmapInfo()。 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 120 章节 2-D 图形库 GUI_SetStreamedBitmapHook() 描述 设 置 挂 钩 函 数,用 于 管 理 未 位 于 CPU 可 寻 址 区 域 中 的 流 位 图 的 调 色 板。挂 钩 函 数 在 执 行 GUI_DrawStreamedBitmapEx() 时调用。 原型 void GUI_SetStreamedBitmapHook( GUI_BITMAPSTREAM_CALLBACK pfStreamedBitmapHook); 参数 pfStreamedBitmapHook 描述 GUI_DrawStreamedBitmapEx() 调用的挂钩函数。 挂钩函数的原型 void * Hook(GUI_BITMAPSTREAM_PARAM * pParam); 参数 pParam 描述 指向 GUI_BITMAPSTREAM_PARAM 结构。 GUI_BITMAPSTREAM_PARAM 的元素 数据类型 int U32 void * 元素 Cmd V p 要执行的命令。 取决于要执行的命令。 取决于要执行的命令。 描述 参数 Cmd 支持的值 GUI_BITMAPSTREAM_GET_BUFFER 收到此命令后,应用程序可以占用位图流调 色板的缓冲区。参数: p – 指示缓冲区或 NULL v – 请求缓冲区大小 如果应用程序已占用调色板的缓冲区,在此 应释放该缓冲区。参数: GUI_BITMAPSTREAM_RELEASE_BUFFER p – 指示要释放的缓冲区 v – 未使用 在加载调色板之后但绘制图像之前发送此命 令,以便能够修改流图像的调色板。参数: GUI_BITMAPSTREAM_MODIFY_PALETTE p – 指示调色板数据 v – 调色板中的颜色数 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 121 示例 static void * _cbStreamedBitmapHook(GUI_BITMAPSTREAM_PARAM * pParam) { void * p = NULL; int i, NumColors; U32 Color; U32 * pColor; switch (pParam->Cmd) { case GUI_BITMAPSTREAM_GET_BUFFER: // // Allocate buffer for palette data // p = malloc(pParam->v); break; case GUI_BITMAPSTREAM_RELEASE_BUFFER: // // Release buffer // free(pParam->p); break; case GUI_BITMAPSTREAM_MODIFY_PALETTE: // // Do something with the palette... // NumColors = pParam->v; pColor = (U32 *)pParam->p; Color = *(pColor + pParam->v - 1); for (i = NumColors - 2; i >= 0; i--) { *(pColor + i + 1) = *(pColor + i); } *pColor = Color; break; } return p; } emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 122 章节 2-D 图形库 7.9 绘制线条 最常用的绘制例程是绘制从一点到另一点的线的例程。 GUI_DrawHLine() 描述 在当前窗口中绘制从某个指定起点到某个指定终点的 1 像素厚的水平直线。 原型 void GUI_DrawHLine(int y, int x0, int x1); 参数 y x0 x1 Y 位置。 X 起始位置。 X 结束位置。 描述 其他信息 如果 x1 < x0,则不会显示任何内容。 大多数 LCD 控制器能够非常迅速地执行此例程,因为一次可以设置多个像素,且无需进行计算。如 果明确要绘制水平直线,则此例程的执行速度比 GUI_DrawLine() 例程快。 GUI_DrawLine() 描述 在当前窗口中绘制从某个指定起点到某个指定终点之间的线 (绝对坐标)。 原型 void GUI_DrawLine(int x0, int y0, int x1, int y1); 参数 x0 y0 x1 y1 X 起始位置。 Y 起始位置。 X 结束位置。 Y 结束位置。 描述 其他信息 如果部分线因没有位于当前窗口中而不可见或当前部分窗口不可见,这是由于裁剪的原因。 GUI_DrawLineRel() 描述 在当前窗口中绘制从当前 (X,Y) 位置到按 X 和 Y 距离指定的终点之间的线 (相对坐标)。 原型 void GUI_DrawLineRel(int dx, int dy); 参数 dx dy X 方向到要绘制的线的终点的距离。 Y 方向到要绘制的线的终点的距离。 描述 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 123 GUI_DrawLineTo() 描述 在当前窗口中绘制从当前 (X,Y) 位置到按 X 和 Y 坐标指定的终点之间的线。 原型 void GUI_DrawLineTo(int x, int y); 参数 x y X 结束位置。 Y 结束位置。 描述 GUI_DrawPolyLine() 描述 在当前窗口中连接预定义的点列表和线。 原型 void GUI_DrawPolyLine(const GUI_POINT * pPoint, int NumPoints, int x, int y); 参数 pPoint NumPoints x y 指向要显示的折线。 点列表中指定的点数量。 原点的 X 位置。 原点的 Y 位置。 描述 其他信息 折线的起点和终点不需要一样。 GUI_DrawVLine() 描述 在当前窗口中绘制从某个指定起点到某个指定终点的 1 像素厚的垂直线。 原型 void GUI_DrawVLine(int x, int y0, int y1); 参数 x y0 y1 X 位置。 Y 起始位置。 Y 结束位置。 描述 其他信息 如果 y1 < y0,则不会显示任何内容。 大多数 LCD 控制器能够非常迅速地执行此例程,因为一次可以设置多个像素,且无需进行计算。如 果明确要绘制水平直线,则此例程的执行速度比 GUI_DrawLine() 例程快。 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 124 章节 GUI_GetLineStyle() 描述 返回函数 GUI_DrawLine 当前使用的线条样式。 原型 U8 GUI_GetLineStyle(void); 返回值 函数 GUI_DrawLine 当前使用的线条样式。 GUI_MoveRel() 描述 相对于其当前位置移动当前的线条指针。 原型 void GUI_MoveRel(int dx, int dy); 参数 dx dy X 方向移动的距离。 Y 方向移动的距离。 相关主题 GUI_DrawLineTo()、 GUI_MoveTo() GUI_MoveTo() 描述 将当前的线条指针移动到给定位置。 原型 void GUI_MoveTo(int x, int y); 参数 x y X 的新位置。 Y 的新位置。 描述 描述 2-D 图形库 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 125 GUI_SetLineStyle() 描述 设置函数 GUI_DrawLine 当前使用的线条样式。 原型 U8 GUI_SetLineStyle(U8 LineStyle); 参数 LineStyle 要使用的新线条样式 (见下表)。 描述 GUI_LS_SOLID GUI_LS_DASH GUI_LS_DOT GUI_LS_DASHDOT GUI_LS_DASHDOTDOT 参数 LineStyle 的允许值 按实线样式绘制线条 (默认)。 按虚线样式绘制线条。 按圆点样式绘制线条。 按虚线和圆点交替的样式绘制线条。 按虚线和双点交替的样式绘制线条。 返回值 函数 GUI_DrawLine 之前使用的线条样式。 其他信息 此函数仅设置 GUI_DrawLine 使用的线条样式。该样式仅用于画笔大小为 1 的情况。 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 126 章节 7.10 绘制多边形 多边形绘制例程对于绘制矢量化符号非常有帮助。 GUI_DrawPolygon() 描述 在当前窗口中绘制按点列表定义的多边形的轮廓。 原型 void GUI_DrawPolygon(const GUI_POINT * pPoint, int NumPoints, int x, int y); 参数 pPoint NumPoints x y 指向要显示的多边形。 点列表中指定的点数量。 原点的 X 位置。 原点的 Y 位置。 描述 其他信息 通过将终点连接到起点,绘制的多边形将自动闭合。 GUI_EnlargePolygon() 描述 按指定的长度 (像素)全方位扩展多边形。 原型 void GUI_EnlargePolygon(GUI_POINT * pDest, const GUI_POINT * pSrc, int NumPoints, int Len); 参数 pDest pSrc NumPoints Len 指向目标多边形。 指向源多边形。 点列表中指定的点数量。 扩展多边形的长度 (像素)。 其他信息 确保点的目标数组等于或大于源数组。 描述 2-D 图形库 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 127 示例 const GUI_POINT aPoints[] = { { 40, 20}, { 0, 20}, { 20, 0} }; GUI_POINT aEnlargedPoints[GUI_COUNTOF(aPoints)]; void Sample(void) { int i; GUI_Clear(); GUI_SetDrawMode(GUI_DM_XOR); GUI_FillPolygon(aPoints, GUI_COUNTOF(aPoints), 140, 110); for (i = 1; i < 10; i++) { GUI_EnlargePolygon(aEnlargedPoints, aPoints, GUI_COUNTOF(aPoints), i * 5); GUI_FillPolygon(aEnlargedPoints, GUI_COUNTOF(aPoints), 140, 110); } } 上述示例的屏幕截图 GUI_FillPolygon() 描述 在当前窗口中绘制按点列表定义的填充的多边形。 原型 void GUI_FillPolygon(const GUI_POINT * pPoint, int NumPoints, int x, int y); 参数 pPoint NumPoints x y 指向要显示和填充的多边形。 点列表中指定的点数量。 原点的 X 位置。 原点的 Y 位置。 描述 其他信息 通过将终点连接到起点,绘制的多边形将自动闭合。终点无需接触到多边形的轮廓。 通过为多边形的各个 y 位置绘制一条或多条水平直线,可对多边形进行渲染。默认情况下,为一个 y 位置绘制水平直线使用的最大点数量为 12(意味着每个 y 位置需要 6 条直线)。如果需要增加此值, 可使用宏 GUI_FP_MAXCOUNT 设置最大点数量。 示例 #define GUI_FP_MAXCOUNT 50 GUI_MagnifyPolygon() 描述 按指定系数放大多边形。 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 128 章节 2-D 图形库 原型 void GUI_MagnifyPolygon(GUI_POINT * pDest, const GUI_POINT * pSrc, int NumPoints, int Mag); 参数 pDest pSrc NumPoints Mag 指向目标多边形。 指向源多边形。 点列表中指定的点数量。 放大多边形使用的系数。 描述 其他信息 确保点的目标数组等于或大于源数组。 请注意扩展和放大多边形之间的区别。调用函数 GUI_EnlargePolygon() (参数 Len = 1)将使 多边形的所有边扩展 1 像素,而调用 GUI_MagnifyPolygon() (参数 Mag = 1)则没有效果。 示例 const GUI_POINT aPoints[] = { { 0, 20}, { 40, 20}, { 20, 0} }; GUI_POINT aMagnifiedPoints[GUI_COUNTOF(aPoints)]; void Sample(void) { int Mag, y = 0, Count = 4; GUI_Clear(); GUI_SetColor(GUI_GREEN); for (Mag = 1; Mag <= 4; Mag *= 2, Count /= 2) { int i, x = 0; GUI_MagnifyPolygon(aMagnifiedPoints, aPoints, GUI_COUNTOF(aPoints), Mag); for (i = Count; i > 0; i--, x += 40 * Mag) { GUI_FillPolygon(aMagnifiedPoints, GUI_COUNTOF(aPoints), x, y); } y += 20 * Mag; } } 上述示例的屏幕截图 GUI_RotatePolygon() 描述 按指定角度旋转多边形。 原型 void GUI_RotatePolygon(GUI_POINT * pDest, const GUI_POINT * pSrc, int NumPoints, emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 129 float 参数 pDest pSrc NumPoints Angle 指向目标多边形。 指向源多边形。 点列表中指定的点数量。 旋转多边形使用的角度 (弧度)。 其他信息 确保点的目标数组等于或大于源数组。 Angle); 描述 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 130 章节 2-D 图形库 示例 以下示例显示了如何绘制多边形。可像 2DGL_DrawPolygon.c 一样在 emWin 随附的示例中找到该 示例。 #include "gui.h" /******************************************************************* * * The points of the arrow */ static const GUI_POINT aPointArrow[] = { { 0, -5}, {-40, -35}, {-10, -25}, {-10, -85}, { 10, -85}, { 10, -25}, { 40, -35}, }; /******************************************************************* * * Draws a polygon */ static void DrawPolygon(void) { int Cnt =0; GUI_SetBkColor(GUI_WHITE); GUI_Clear(); GUI_SetFont(&GUI_Font8x16); GUI_SetColor(0x0); GUI_DispStringAt("Polygons of arbitrary shape ", 0, 0); GUI_DispStringAt("in any color", 120, 20); GUI_SetColor(GUI_BLUE); /* Draw filled polygon */ GUI_FillPolygon (&aPointArrow[0],7,100,100); } /******************************************************************* * * main */ void main(void) { GUI_Init(); DrawPolygon(); while(1) GUI_Delay(100); } 上述示例的屏幕截图 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 131 7.11 绘制圆 GUI_DrawCircle() 描述 在当前窗口中的指定位置绘制指定尺寸的圆的轮廓。 原型 void GUI_DrawCircle(int x0, int y0, int r); 参数 x0 y0 r 客户端窗口的圆心的 X 位置 (像素)。 客户端窗口的圆心的 Y 位置 (像素)。 圆的半径 (直径的一半)。 最小:0 (将成为点);最大:180。 描述 其他信息 此例程无法处理大于 180 的半径,因为它使用整数计算,否则将导致溢出。不过,对于大多数嵌入式 应用程序而言,这不是问题,因为直径为 360 的圆比显示器还要大。 示例 // Draw concentric circles void ShowCircles(void) { int i; for (i=10; i<50; i += 3) GUI_DrawCircle(120, 60, i); } 上述示例的屏幕截图 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 132 章节 GUI_FillCircle() 描述 在当前窗口中的指定位置绘制指定尺寸的填充的圆。 原型 void GUI_FillCircle(int x0, int y0, int r); 参数 x0 y0 r 客户端窗口的圆心的 X 位置 (像素)。 客户端窗口的圆心的 Y 位置 (像素)。 圆的半径 (直径的一半)。 最小:0 (将成为点);最大:180。 描述 其他信息 此例程无法处理大于 180 的半径。 示例 GUI_FillCircle(120,60,50); 上述示例的屏幕截图 2-D 图形库 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 133 7.12 绘制椭圆 GUI_DrawEllipse() 描述 在当前窗口中的指定位置绘制指定尺寸的椭圆的轮廓。 原型 void GUI_DrawEllipse(int x0, int y0, int rx, int ry); 参数 x0 y0 rx ry 客户端窗口的圆心的 X 位置 (像素)。 客户端窗口的圆心的 Y 位置 (像素)。 椭圆的 X 半径 (直径的一半)。 最小:0 ;最大: 180。 椭圆的 Y 半径 (直径的一半)。 最小:0 ;最大: 180。 描述 其他信息 此例程无法处理大于 180 的 rx/ry 参数,因为它使用整数计算,否则将导致溢出。 示例 请参见 GUI_FillEllipse() 示例。 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 134 章节 GUI_FillEllipse() 描述 在当前窗口中的指定位置绘制指定尺寸的填充的椭圆。 原型 void GUI_FillEllipse(int x0, int y0, int rx, int ry); 参数 x0 y0 rx ry 客户端窗口的圆心的 X 位置 (像素)。 客户端窗口的圆心的 Y 位置 (像素)。 椭圆的 X 半径 (直径的一半)。 最小:0 ;最大: 180。 椭圆的 Y 半径 (直径的一半)。 最小:0 ;最大: 180。 描述 其他信息 此例程无法处理大于 180 的 rx/ry 参数。 示例 // Demo ellipses GUI_SetColor(0xff); GUI_FillEllipse(100, 180, 50, 70); GUI_SetColor(0x0); GUI_DrawEllipse(100, 180, 50, 70); GUI_SetColor(0x000000); GUI_FillEllipse(100, 180, 10, 50); 上述示例的屏幕截图 2-D 图形库 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 135 7.13 绘制弧线 GUI_DrawArc() 描述 在当前窗口中的指定位置绘制指定尺寸的弧线。弧线是圆轮廓的一部分。 原型 void GUI_DrawArc(int xCenter, int yCenter, int rx, int ry, int a0, int a1); 参数 xCenter yCenter rx ry a0 a1 客户端窗口中心的水平位置 (像素)。 客户端窗口中心的垂直位置 (像素)。 X 半径 (像素)。 Y 半径 (像素)。 起始角度 (度)。 结束角度 (度)。 描述 局限 当前未使用 ry 参数,而使用 rx 参数代替。 其他信息 GUI_DrawArc() 使用浮点库。它无法处理大于 180 的 rx/ry 参数,因为它使用整数计算,否则将 导致溢出。 示例 void DrawArcScale(void) { int x0 = 160; int y0 = 180; int i; char ac[4]; GUI_SetBkColor(GUI_WHITE); GUI_Clear(); GUI_SetPenSize( 5 ); GUI_SetTextMode(GUI_TM_TRANS); GUI_SetFont(&GUI_FontComic18B_ASCII); GUI_SetColor(GUI_BLACK); GUI_DrawArc( x0,y0,150, 150,-30, 210 ); GUI_Delay(1000); for (i=0; i<= 23; i++) { float a = (-30+i*10)*3.1415926/180; int x = -141*cos(a)+x0; int y = -141*sin(a)+y0; if (i%2 == 0) GUI_SetPenSize( 5 ); else GUI_SetPenSize( 4 ); GUI_DrawPoint(x,y); if (i%2 == 0) { x = -123*cos(a)+x0; y = -130*sin(a)+y0; sprintf(ac, "%d", 10*i); GUI_SetTextAlign(GUI_TA_VCENTER); GUI_DispStringHCenterAt(ac,x,y); } } } emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 136 章节 上述示例的屏幕截图 2-D 图形库 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 137 7.14 绘制线图 GUI_DrawGraph() 描述 立即绘制线图。 原型 void GUI_DrawGraph(I16 * paY, int NumPoints, int x0, int y0); 参数 paY NumPoints x0 y0 指向包含线图 Y 值的数组。 要显示的 Y 值的数量。 X 的起始点。 y 的起始点。 描述 其他信息 该函数首先设置到使用 x0、 y0 和给定数组的第一个 Y 值所指定位置的直线光标。然后,将开始绘制 到 x0 + 1、 y0 + *(paY + 1)、 x0 + 2、 y0 + *(paY + 2) 等位置的线。 示例 #include "GUI.h" #include I16 aY[100]; void main(void) { int i; GUI_Init(); for (i = 0; i < GUI_COUNTOF(aY); i++) { aY[i] = rand() % 50; } GUI_DrawGraph(aY, GUI_COUNTOF(aY), 0, 0); } 上述示例的屏幕截图 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 138 章节 2-D 图形库 7.15 绘制饼图 GUI_DrawPie() 描述 绘制圆形扇区。 原型 void GUI_DrawPie(int x0, int y0, int r, int a0, int a1, int Type); 参数 x0 y0 r a0 a1 Type 客户端窗口的圆心的 X 位置 (像素)。 客户端窗口的圆心的 Y 位置 (像素)。 圆的半径 (直径的一半)。 起始角度 (度)。 结束角度 (度)。 (留待将来使用,应为 0) 描述 示例 int i, a0, a1; const unsigned aValues[] = { 100, 135, 190, 240, 340, 360}; const GUI_COLOR aColors[] = { GUI_BLUE, GUI_GREEN, GUI_RED, GUI_CYAN, GUI_MAGENTA, GUI_YELLOW }; for (i = 0; i < GUI_COUNTOF(aValues); i++) { a0 = (i == 0) ?0 :aValues[i - 1]; a1 = aValues[i]; GUI_SetColor(aColors[i]); GUI_DrawPie(100, 100, 50, a0, a1, 0); } 上述示例的屏幕截图 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 139 7.16 保存和恢复 GUI 环境 GUI_RestoreContext() 描述 该函数将恢复 GUI 环境。 原型 void GUI_RestoreContext(const GUI_CONTEXT * pContext); 参数 pContext 指向包含新环境的 GUI_CONTEXT 结构。 描述 其他信息 GUI 环境包含 GUI 的当前状态,例如文本游标位置、当前字体指针等。有时,保存当前状态并在以 后进行恢复非常有用。对此,您可以使用这些函数。 GUI_SaveContext() 描述 该函数将保存当前的 GUI 环境。(另请参见 GUI_RestoreContext) 原型 void GUI_SaveContext(GUI_CONTEXT * pContext); 参数 pContext 描述 指向用于保存当前环境的 GUI_CONTEXT 结构。 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 140 章节 7.17 裁剪 GUI_SetClipRect() 描述 设置用于限制输出的裁剪矩形。 原型 void GUI_SetClipRect(const GUI_RECT * pRect); 参数 pRect 描述 指向应用于裁剪的矩形。恢复默认值应使用空指针。 其他信息 默认情况下,裁剪区域限制为配置的 (虚拟)显示器大小。 某些情况下,使用通过此函数可以设置的较小的裁剪矩形比较有用。 引用的矩形应保持不变,直到使用空指针再次调用该函数。 示例 以下示例显示了如何使用该函数: GUI_RECT Rect = {10, 10, 100, 100}; GUI_SetClipRect(&Rect); . . /* Use the clipping area ...*/ . GUI_SetClipRect(NULL); 2-D 图形库 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 141 第8章 显示位图文件 显示编译时已知位图建议采用且最高效的方式是使用位图转换器将其转换为 C 文件,并添加到项目 / 生成文件中。有关位图转换器的详细信息,请参阅 “位图转换器”(第 213 页)。 如果应用程序需要显示编译时未知的图像,该图像需要有受 emWin 支持的图形文件格式。在这种情 况下,该图像文件可位于存储器或其他存储设备中,即使可用的存储量低于该图像文件的大小,亦可 以对其显示。 emWin 当前支持 BMP、 JPEG、 GIF 和 PNG 文件格式。 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 142 章节 显示位图文件 8.1 BMP 文件支持 尽管可用于 emWin 的位图通常作为 C 文件编译和链接到应用程序,但有时候使用这些类型的结构可 能并不理想。常见的示例即不断引用用户下载的位图等新图像的应用程序。下列函数支持加载到存储 器的 bmp 文件。 对于您计划再利用(即公司图标)的图像,将其作为 emWin 可直接使用的 C 文件编译和链接则更为 便捷。使用位图转换器可轻松完成此任务。 8.1.1 支持的格式 BMP 文件格式由 Microsoft 定义。下表显示了许多不同的格式: 每像素位数 索引 1 是 4 是 4 是 8 是 8 是 16 否 24 否 32 否 压缩 否 否 是 否 是 否 否 否 支持 是 是 是 是 是 是 是 是 8.1.2 BMP 文件 API 下表按字母顺序列出了可用的 BMP 文件相关的例程。以下为详细描述: 例程 GUI_BMP_Draw() GUI_BMP_DrawEx() GUI_BMP_DrawScaled() GUI_BMP_DrawScaledEx() GUI_BMP_GetXSize() GUI_BMP_GetXSizeEx() GUI_BMP_GetYSize() GUI_BMP_GetYSizeEx() GUI_BMP_Serialize() GUI_BMP_SerializeEx() 描述 绘制已加载到存储器的 BMP 文件。 绘制无需加载到存储器的 BMP 文件。 绘制已加载到存储器的带比例的 BMP 文件。 绘制无需加载到存储器的带比例的 BMP 文件。 返回加载到存储器的 BMP 文件的 X 大小。 返回无需加载到存储器的 BMP 文件的 X 大小。 返回加载到存储器的位图的 Y 大小。 返回无需加载到存储器的 BMP 文件的 Y 大小。 创建 BMP 文件。 基于给定的矩形创建 BMP 文件。 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 143 GUI_BMP_Draw() 描述 在当前窗口中的指定位置绘制已加载到存储器的 Windows bmp 文件。 原型 int GUI_BMP_Draw(const void * pFileData, int x0, int y0); 参数 pFileData x0 y0 描述 指向 bmp 文件所在的存储器区域的起始位置。 显示器中位图左上角的 X 位置。 显示器中位图左上角的 Y 位置。 其他信息 本章开头的表显示了受支持的 BMP 文件格式。示例 2DGL_DrawBMP.c 显示了如何使用该函数。 GUI_BMP_DrawEx() 描述 在当前窗口中的指定位置绘制不必加载到存储器的 bmp 文件。 原型 int GUI_BMP_DrawEx(GUI_GET_DATA_FUNC * pfGetData, void * p, int x0, int y0); 参数 pfGetData p x0 y0 描述 指向获取数据调用的函数。更多 GetData 函数的详细信息,请参阅“使用 ...Ex() 函数获取数据”(第 167 页)。 传递到 pfGetData 所指函数的 Void 指针。 显示器中位图左上角的 X 位置。 显示器中位图左上角的 Y 位置。 返回值 0 表示成功,非 0 表示该函数失败。 其他信息 如果存储器没有足够的 RAM 加载整个文件,可使用此函数来绘制 bmp 文件。图形用户界面 (GUI) 库 将调用参数 pfGetData 所指向的函数来读取数据。 GetData 函数需要返回请求的字节数。 GUI 请 求的最大字节数为绘制一行图像所需的字节数。 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 144 章节 显示位图文件 GUI_BMP_DrawScaled() 描述 在当前窗口中的指定位置通过缩放比例绘制已加载到存储器的 bmp 文件。 原型 int GUI_BMP_DrawScaled(const void * pFileData, int x0, int y0, int Num, int Denom); 参数 pFileData x0 y0 Num Denom 描述 指向 bmp 文件所在的存储器区域的起始位置。 显示器中位图左上角的 X 位置。 显示器中位图左上角的 Y 位置。 用于缩放比例的分子。 用于缩放比例的分母。 返回值 0 表示成功,非 0 表示该函数失败。 其他信息 该函数通过使用给定的分子和分母构建分数来缩放图像。例如,如果图像应缩减至 2/3 大小,则 Num 应为 2, Denom 应为 3。 GUI_BMP_DrawScaledEx() 描述 在当前窗口中的指定位置通过缩放比例绘制不必加载到存储器的 bmp 文件。 原型 int GUI_BMP_DrawScaledEx(GUI_GET_DATA_FUNC * pfGetData, void * p, int x0, int y0, int Num, int Denom); 参数 pfGetData p x0 y0 Num Denom 描述 指向获取数据调用的函数。更多 GetData 函数的详细信息,请参阅“使用 ...Ex() 函数获取数据”(第 167 页)。 传递到 pfGetData 所指函数的 Void 指针。 显示器中位图左上角的 X 位置。 显示器中位图左上角的 Y 位置。 用于缩放比例的分子。 用于缩放比例的分母。 返回值 0 表示成功,非 0 表示该函数失败。 其他信息 该函数通过使用给定的分子和分母构建分数来缩放图像。例如,如果图像应缩减至 2/3 大小,则 Num 应为 2, Denom 应为 3。 更多详细信息,请参阅 “GUI_BMP_DrawEx()”(第 143 页)。 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 145 GUI_BMP_GetXSize() 描述 返回已加载到存储器的指定位图的 X 大小。 原型 int GUI_BMP_GetXSize(const void * pFileData); 参数 pFileData 描述 指向 bmp 文件所在的存储器区域的起始位置。 返回值 位图的 X 大小。 GUI_BMP_GetXSizeEx() 描述 返回不必加载到存储器的指定 bmp 文件的 X 大小。 原型 int GUI_BMP_GetXSizeEx(GUI_GET_DATA_FUNC * pfGetData, void * p); 参数 pfGetData p 描述 指向获取数据调用的函数。更多 GetData 函数的详细信息,请参阅“使用 ...Ex() 函数获取数据”(第 167 页)。 传递到 pfGetData 所指函数的 Void 指针。 返回值 位图的 X 大小。 GUI_BMP_GetYSize() 描述 返回已加载到存储器的指定位图的 Y 大小。 原型 int GUI_BMP_GetYSize(const void * pFileData);; 参数 pFileData 描述 指向 bmp 文件所在的存储器区域的起始位置。 返回值 位图的 Y 大小。 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 146 章节 显示位图文件 GUI_BMP_GetYSizeEx() 描述 返回不必加载到存储器的指定 bmp 文件的 X 大小。 原型 int GUI_BMP_GetYSizeEx(GUI_GET_DATA_FUNC * pfGetData, void * p); 参数 pfGetData p 描述 指向获取数据调用的函数。更多 GetData 函数的详细信息,请参阅“使用 ...Ex() 函数获取数据”(第 167 页)。 传递到 pfGetData 所指函数的 Void 指针。 返回值 位图的 Y 大小。 GUI_BMP_Serialize() 描述 该函数创建包含 LCD 完整内容的 BMP 文件。 原型 void GUI_BMP_Serialize(GUI_CALLBACK_VOID_U8_P * pfSerialize, void * p); 参数 pfSerialize p 指向串行化函数 指向传递到串行化函数的用户定义数据 描述 其他信息 以下示例将显示如何在窗口中创建 BMP 文件。 static void _DrawSomething(void) { /* Draw something */ GUI_DrawLine(10, 10, 100, 100); } static void _WriteByte2File(U8 Data, void * p) { U32 nWritten; WriteFile(*((HANDLE *)p), &Data, 1, &nWritten, NULL); } static void _ExportToFile(void) { HANDLE hFile = CreateFile("C:\\GUI_BMP_Serialize.bmp", GENERIC_WRITE, 0, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); GUI_BMP_Serialize(_WriteByte2File, &hFile); CloseHandle(hFile); } void main(void) { GUI_Init(); _DrawSomething(); _ExportToFile(); } emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 147 GUI_BMP_SerializeEx() 描述 该函数将创建包含给定区域的 BMP 文件。 原型 void GUI_BMP_SerializeEx(GUI_CALLBACK_VOID_U8_P * pfSerialize, int x0, int y0, int xSize, int ySize, void * p); 参数 pfSerialize x0 y0 xSize ySize p 指向串行化函数。 创建 BMP 文件的 X 起始位置。 创建 BMP 文件的 Y 起始位置。 X 的大小。 Y 的大小。 指向传递到串行化函数的用户定义数据。 其他信息 请参阅 “GUI_BMP_Serialize()”(第 146 页)。 描述 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 148 章节 显示位图文件 8.2 JPEG 文件支持 JPEG (读音为 “jay-peg”)是全彩和灰度图像的标准压缩方法。 JPEG 用于压缩 “真实世界”的 景象、线条画、卡通,其他非现实图像并不是其强项。 JPEG 会有损耗,意指输出图像与输入图像并 不完全相同。因此,如果您必须达到完全相同的输出位,则不能使用 JPEG。不过,对于常见的照片 图像,可以得到非常好的压缩级别,看不出变化。并且如果您能容忍低质量的图像,则可以实现相当 高的压缩级别。 8.2.1 支持的 JPEG 压缩方法 此软件执行 JPEG 基准、可扩展顺序以及渐进式的压缩流程。尽管尚未实施某些不常见的参数设置, 但它支持这些流程的所有变体。出于法律原因,不得分发 JPEG 算术编码变体的代码。 JPEG 规范的 算术编码选项似乎属于归 IBM、 AT&T 和 Mitsubishi 所有的专利。因此,从法律上讲,如未获得一 个或多个许可,则不能使用算术编码。因此,尚未包含对算术编码的支持。(由于算术编码相对于未 获专利的 Huffman 模式仅具有限界收益,因此不太可能有太多实施支持它。) JPEG 文件支持不包含提供标准中定义的层次式或无损流程。 8.2.2 将 JPEG 文件转换为 C 源 某些情况下,将 JPEG 文件作为 C 文件添加到项目中非常有用。这时,首先需要将 JPEG 文件转换为 C 文件。使用 emWin 随附的工具 Bin2C.exe 可完成此任务。在 “工具”子文件夹中可找到该工 具。它可以将给定的二进制文件(在本例中为 JPEG 文件)转换为 C 文件。C 文件的文件名与二进制 文件名称相同,采用文件扩展名 “.c”。 以下步骤将显示如何使用 Bin2C 嵌入 JPEG 文件: • 启动 Bin2C.exe,并选择要转换为 C 文件的 JPEG 文件 (例如 “Image.jpeg”),然后将其 转换为 C 文件。 • 将该 C 文件添加到项目中。 示例 以下示例显示如何显示转换的 JPEG 文件: #include "GUI.h" #include "Image.c" /* Include the converted C file */ void main(void) { GUI_Init(); GUI_JPEG_Draw(acImage, sizeof(acImage), 0, 0); ... } 8.2.3 显示 JPEG 文件 图形库首先对图形信息进行解码。如果必须绘制图像,解码流程将花费相当长的时间。如果在窗口管 理器经常调用的 callback 例程中使用 JPEG 文件,则解码流程可能花费相当长的时间。通过使用存 储设备可缩短计算时间。最好的方法是先将图像绘制到存储设备中。在这种情况下,将只进行一次解 压缩。更多关于存储设备的信息,请参见 “存储设备”(第 247 页)。 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 149 8.2.4 存储器使用 JPEG 解压缩大约需要 33 Kb RAM 用于与图像大小无关的解压缩和依赖大小的字节量。RAM 要求可 按以下方式计算: App. 大约 RAM 要求 = 图像的 X 大小 * 80 字节 + 33 千字节 依赖于 X 大小的量取决于 JPEG 文件的压缩类型。下表显示了部分示例: 压缩 H1V1 H2V2 GRAY 图像大小 (像素) 160x120 160x120 160x120 RAM 使用 [ 千字节 ] 45 46 38 RAM 使用,大小依赖量 [ 千字节 ] 12 13 4 解压缩所需的存储器由 emWin 存储器管理系统动态分配。绘制 JPEG 图像后,将释放整个 RAM。 8.2.5 渐进式 JPEG 文件 与基准和可扩展顺序的 JPEG 文件相反,渐进式 JPEG 包含多次扫描。每次扫描均基于上次扫描,并 优化 JPEG 图像的外观。这要求即使只有一行需要解压缩,也要对整个文件进行扫描。 如果针对全部图像数据配置了足够的 RAM,则解压缩只需进行一次。如果配置的 RAM 较少, JPEG 解码器将使用 “banding”绘制图像。所需的带越多,图像需要进行解压缩的次数越多,且性能越 慢。换句话说:RAM 越多,性能越好。 8.2.6 JPEG 文件 API 下表按字母顺序列出了可用的 JPEG 文件相关的例程。以下为详细描述: 例程 GUI_JPEG_Draw() GUI_JPEG_DrawEx() GUI_JPEG_DrawScaled() GUI_JPEG_DrawScaledEx() GUI_JPEG_GetInfo() GUI_JPEG_GetInfoEx() 描述 绘制已加载到存储器的 JPEG 文件。 绘制无需加载到存储器的 JPEG 文件。 绘制已加载到存储器的带比例的 JPEG 文件。 绘制无需加载到存储器的带比例的 JPEG 文件。 基于已加载到存储器的 JPEG 文件填充 GUI_JPEG_INFO 结构。 基于无需加载到存储器的 JPEG 文件填充 GUI_JPEG_INFO 结构。 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 150 章节 显示位图文件 GUI_JPEG_Draw() 描述 在当前窗口中的指定位置绘制已加载到存储器的 jpeg 文件。 原型 int GUI_JPEG_Draw(const void * pFileData, int DataSize, int x0, int y0); 参数 pFileData DataSize x0 y0 描述 指向 jpeg 文件所在的存储器区域的起始位置。 Jpeg 文件的字节数。 显示器中位图左上角的 X 位置。 显示器中位图左上角的 Y 位置。 返回值 0 表示成功,非 0 表示该函数失败。(当前的实施始终返回 0) 其他信息 “样本”文件夹中包含示例 2DGL_DrawJPG.c,它显示了如何使用该函数。 GUI_JPEG_DrawEx() 描述 在当前窗口中的指定位置绘制不必加载到存储器的 jpeg 文件。 原型 int GUI_JPEG_DrawEx(GUI_GET_DATA_FUNC * pfGetData, void * p, int x0, int y0); 参数 pfGetData p x0 y0 描述 指向获取数据调用的函数。更多 GetData 函数的详细信息,请参阅“使用 ...Ex() 函数获取数据”(第 167 页)。 传递到 pfGetData 所指函数的 Void 指针。 显示器中位图左上角的 X 位置。 显示器中位图左上角的 Y 位置。 返回值 0 表示成功,非 0 表示该函数失败。(当前的实施始终返回 0) 其他信息 如果存储器没有足够的 RAM 加载整个文件,可使用此函数来绘制 jpegs 文件。然后, JPEG 库将调 用参数 pfGetData 所指向的函数来读取数据。 GetData 函数应返回可用的字节数。这可能小于或等于请求的字节数。该函数至少需要返回 1 个新 字节。“样本”文件夹中包含示例 2DGL_DrawJPGScaled.c,它显示了如何使用 GetData 函数。 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 151 GUI_JPEG_DrawScaled() 描述 在当前窗口中的指定位置通过缩放比例绘制已加载到存储器的 jpeg 文件。 原型 int GUI_JPEG_DrawScaled(const void * pFileData, int DataSize, int x0, int y0, int Num, int Denom); 参数 pFileData DataSize x0 y0 Num Denom 描述 指向 jpeg 文件所在的存储器区域的起始位置。 Jpeg 文件的字节数。 显示器中位图左上角的 X 位置。 显示器中位图左上角的 Y 位置。 用于缩放比例的分子。 用于缩放比例的分母。 返回值 0 表示成功,非 0 表示该函数失败。(当前的实施始终返回 0) 其他信息 该函数通过使用给定的分子和分母构建分数来缩放图像。例如,如果图像应缩减至 2/3 大小,则 Num 应为 2, Denom 应为 3。 “样本”文件夹中包含示例 2DGL_DrawJPGScaled.c,它显示了如何绘制缩放的 JPEG 文件。 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 152 章节 显示位图文件 GUI_JPEG_DrawScaledEx() 描述 在当前窗口中的指定位置通过缩放比例绘制不必加载到存储器的 jpeg 文件。 原型 int GUI_JPEG_DrawScaledEx(GUI_GET_DATA_FUNC * pfGetData, void * p, int x0, int y0, int Num, int Denom); 参数 pfGetData p x0 y0 Num Denom 描述 指向获取数据调用的函数。更多 GetData 函数的详细信息,请参阅“使用 ...Ex() 函数获取数据”(第 167 页)。 传递到 pfGetData 所指函数的 Void 指针。 显示器中位图左上角的 X 位置。 显示器中位图左上角的 Y 位置。 用于缩放比例的分子。 用于缩放比例的分母。 返回值 0 表示成功,非 0 表示该函数失败。(当前的实施始终返回 0) 其他信息 该函数通过使用给定的分子和分母构建分数来缩放图像。例如,如果图像应缩减至 2/3 大小,则 Num 应为 2, Denom 应为 3。 更多详细信息,请参阅 “GUI_JPEG_DrawEx()”(第 150 页)。 “样本”文件夹中包含示例 2DGL_DrawJPGScaled.c,它显示了如何使用该函数。 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 153 GUI_JPEG_GetInfo() 描述 利用已加载到存储器的 jpeg 文件的相关信息填充 GUI_JPEG_INFO 结构。 原型 int GUI_JPEG_GetInfo(const void * pFileData, int DataSize, GUI_JPEG_INFO * pInfo); 参数 pFileData DataSize pInfo 描述 指向 jpeg 文件所在的存储器区域的起始位置。 Jpeg 文件的字节数。 指向该函数要填充的 GUI_JPEG_INFO 结构。 返回值 0 表示成功,非 0 表示该函数失败。 GUI_JPEG_INFO 的元素 数据类型 元素 描述 int int XSize YSize 图像的 X 像素大小。 图像的 Y 像素大小。 其他信息 “样本”文件夹中包含示例 2DGL_DrawJPG.c,它显示了如何使用该函数。 GUI_JPEG_GetInfoEx() 描述 利用不必加载到存储器的 jpeg 文件的相关信息填充 GUI_JPEG_INFO 结构。 原型 int GUI_JPEG_GetInfoEx(GUI_GET_DATA_FUNC * pfGetData, void * p, GUI_JPEG_INFO * pInfo); 参数 pfGetData p pInfo 描述 指向获取数据调用的函数。更多 GetData 函数的详细信息,请参阅“使用 ...Ex() 函数获取数据”(第 167 页)。 传递到 pfGetData 所指函数的 Void 指针。 指向该函数要填充的 GUI_JPEG_INFO 结构。 返回值 0 表示成功,非 0 表示该函数失败。 其他信息 有关该函数以及参数 pfGetData 和 p 的更多详细信息,请参阅 “GUI_JPEG_GetInfo()”(第 153 页)和 “GUI_JPEG_DrawEx()”(第 150 页)。 “样本”文件夹中包含示例 2DGL_DrawJPGScaled.c,它显示了如何使用该函数。 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 154 章节 显示位图文件 8.3 GIF 文件支持 20 世纪 80 年代,CompuServe Information Service 开发出了 GIF 文件格式(图形交换格式)。 它设计用于跨数据网络传输图像。 GIF 标准支持隔行扫描、透明、应用定义数据、动画以及原始文本渲染。 emWin 将忽略原始文本或 应用特定数据等不受支持的数据。 GIF 文件使用 LZW (Lempel-Zif-Welch) 文件压缩方法来压缩图像数据。这种压缩方法运行起来不 会丢失数据。输出图像与输入图像完全相同。 8.3.1 将 GIF 文件转换为 C 源 某些情况下,将 GIF 文件作为 C 文件添加到项目中非常有用。对此,可完全按照前面介绍的 “JPEG 文件支持”下的相同方式来执行。 8.3.2 显示 GIF 文件 图形库首先对图形信息进行解码。如果必须绘制图像,解码流程将花费相当长的时间。如果在窗口管 理器经常调用的 callback 例程中使用 GIF 文件,则解码流程可能花费相当长的时间。通过使用存储 设备可缩短计算时间。最好的方法是先将图像绘制到存储设备中。在这种情况下,将只进行一次解压 缩。更多关于存储设备的信息,请参见 “存储设备”(第 247 页)。 8.3.3 存储器使用 emWin 的 GIF 解压缩例程大约需要 16 千字节动态分配的 RAM 进行解压缩。绘制图像后,将释放 用于解压缩的 RAM。 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 155 8.3.4 GIF 文件 API 下表按字母顺序列出了可用的 GIF 文件相关的例程。以下为详细描述: 例程 GUI_GIF_Draw() GUI_GIF_DrawEx() GUI_GIF_DrawSub() GUI_GIF_DrawSubEx() GUI_GIF_DrawSubScaled() GUI_GIF_DrawSubScaledEx() GUI_GIF_GetComment() GUI_GIF_GetCommentEx() GUI_GIF_GetImageInfo() GUI_GIF_GetImageInfoEx() GUI_GIF_GetInfo() GUI_GIF_GetInfoEx() GUI_GIF_GetXSize() GUI_GIF_GetXSizeEx() GUI_GIF_GetYSize() GUI_GIF_GetYSizeEx() 描述 绘制已加载到存储器的 GIF 文件的第一个图像。 绘制无需加载到存储器的 GIF 文件的第一个图像。 绘制已加载到存储器的 GIF 文件的给定子图像。 绘制无需加载到存储器的 GIF 文件的给定子图像。 绘制已加载到存储器的带比例的 GIF 文件的给定子图像。 绘制无需加载到存储器的带比例的 GIF 文件的给定子图像。 返回已加载到存储器的 GIF 文件的给定注释。 返回无需加载到存储器的 GIF 文件的给定注释。 返回已加载到存储器的 GIF 文件给定子图像的相关信息。 返回无需加载到存储器的 GIF 文件给定子图像的相关信息。 返回已加载到存储器的 GIF 文件的相关信息。 返回无需加载到存储器的 GIF 文件的相关信息。 返回加载到存储器的位图的 X 大小。 返回无需加载到存储器的位图的 X 大小。 返回加载到存储器的位图的 Y 大小。 返回无需加载到存储器的位图的 Y 大小。 GUI_GIF_Draw() 描述 在当前窗口中的指定位置绘制已加载到存储器的 gif 文件的第一个图像。 原型 int GUI_GIF_Draw(const void * pGIF, U32 NumBytes, int x0, int y0); 参数 pGIF NumBytes x0 y0 指向 gif 文件所在的存储器区域的起始位置。 Gif 文件的字节数。 显示器中位图左上角的 X 位置。 显示器中位图左上角的 Y 位置。 描述 返回值 0 表示成功, != 0 表示错误。 其他信息 如果该文件包含多个图像,此函数将仅显示该文件的第一个图像。支持透明和隔行扫描的图像。 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 156 章节 显示位图文件 GUI_GIF_DrawEx() 描述 在当前窗口中的指定位置绘制不必加载到存储器的 gif 文件。 原型 int GUI_GIF_DrawEx(GUI_GET_DATA_FUNC * pfGetData, void * p, int x0, int y0); 参数 pfGetData p x0 y0 描述 指向获取数据调用的函数。更多 GetData 函数的详细信息,请参阅“使用 ...Ex() 函数获取数据”(第 167 页)。 传递到 pfGetData 所指函数的 Void 指针。 显示器中位图左上角的 X 位置。 显示器中位图左上角的 Y 位置。 返回值 0 表示成功,非 0 表示该函数失败。 其他信息 如果存储器没有足够的 RAM 加载整个文件,可使用此函数来绘制 gif 文件。然后,库会调用参数 pfGetData 所指的函数来读取数据。 GetData 函数应返回可用的字节数。这可能小于或等于请求的字节数。该函数至少需要返回 1 个新 字节。 GUI_GIF_DrawSub() 描述 在当前窗口中的指定位置绘制已加载到存储器的 gif 文件的给定子图像。 原型 int GUI_GIF_DrawSub(const void * pGIF, U32 NumBytes, int x0, int y0, int Index); 参数 pGIF NumBytes x0 y0 Index 指向 gif 文件所在的存储器区域的起始位置。 Gif 文件的字节数。 显示器中位图左上角的 X 位置。 显示器中位图左上角的 Y 位置。 要显示的子图像基于 0 的索引。 描述 返回值 0 表示成功, != 0 表示错误。 其他信息 该函数管理当前图像和上一图像之间的背景像素。例如,如果子图像 #3 应按 x20/y20 偏移量绘制, 大小为 w10/h10,而上一个子图像在 x15/y15 位置以 w20/h20 大小显示,且需要重新绘制背景, 该函数将使用背景颜色填充图像之间的像素。 “样本”文件夹的 2DGL_DrawGIF.c 文件显示了如何使用该函数。 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 157 GUI_GIF_DrawSubEx() 描述 在当前窗口中的指定位置绘制不必加载到存储器的 gif 文件的给定子图像。 原型 int GUI_GIF_DrawSubEx(GUI_GET_DATA_FUNC * pfGetData, void * p, int x0, int y0, int Index); 参数 pfGetData p x0 y0 Index 描述 指向获取数据调用的函数。更多 GetData 函数的详细信息,请参阅“使用 ...Ex() 函数获取数据”(第 167 页)。 传递到 pfGetData 所指函数的 Void 指针。 显示器中位图左上角的 X 位置。 显示器中位图左上角的 Y 位置。 要显示的子图像基于 0 的索引。 返回值 0 表示成功,非 0 表示该函数失败。 其他信息 如果存储器没有足够的 RAM 加载整个文件,可使用此函数来绘制 gif 图像。图形用户界面 (GUI) 库 将调用参数 pfGetData 所指向的函数来读取数据。 更多详细信息,请参阅 “GUI_GIF_DrawEx()”(第 156 页)。 GUI_GIF_DrawSubScaled() 描述 在当前窗口中的指定位置绘制已加载到存储器的 gif 文件的给定子图像。 原型 int GUI_GIF_DrawSubScaled(const void * pGIF, U32 NumBytes, int x0, int y0, int Index, int Num, int Denom); 参数 pGif NumBytes x0 y0 Index Num Denom 指向 gif 文件所在的存储器区域的起始位置。 Gif 文件的字节数。 显示器中位图左上角的 X 位置。 显示器中位图左上角的 Y 位置。 要显示的子图像基于 0 的索引。 用于缩放比例的分子。 用于缩放比例的分母。 描述 返回值 0 表示成功,非 0 表示该函数失败。 其他信息 该函数通过使用给定的分子和分母构建分数来缩放图像。例如,如果图像应缩减至 2/3 大小,则 Num 应为 2, Denom 应为 3。 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 158 章节 显示位图文件 GUI_GIF_DrawSubScaledEx() 描述 在当前窗口中的指定位置通过缩放比例绘制已加载到存储器的 gif 文件的给定子图像。 原型 int GUI_GIF_DrawSubScaledEx(GUI_GET_DATA_FUNC * pfGetData, void * p, int x0, int y0, int Index, int Num, int Denom); 参数 pfGetData p x0 y0 Index Num Denom 描述 指向获取数据调用的函数。更多 GetData 函数的详细信息,请参阅“使用 ...Ex() 函数获取数据”(第 167 页)。 传递到 pfGetData 所指函数的 Void 指针。 显示器中位图左上角的 X 位置。 显示器中位图左上角的 Y 位置。 要显示的子图像基于 0 的索引。 用于缩放比例的分子。 用于缩放比例的分母。 返回值 0 表示成功,非 0 表示该函数失败。 其他信息 该函数通过使用给定的分子和分母构建分数来缩放图像。例如,如果图像应缩减至 2/3 大小,则 Num 应为 2, Denom 应为 3。 GUI_GIF_GetComment() 描述 返回已加载到存储器的 GIF 图像的给定注释。 原型 int GUI_GIF_GetComment(const void * pGIF, U32 NumBytes, U8 * pBuffer, int MaxSize, int Index); 参数 pGIF NumBytes pBuffer MaxSize Index 描述 指向 gif 文件所在的存储器区域的起始位置。 Gif 文件的字节数。 指向填充了注释的缓冲区。 缓冲区的大小。 要返回的注释基于 0 的索引。 返回值 0 表示成功, != 0 表示错误。 其他信息 GIF 文件可以包含 1 个或多个注释。该函数会将注释复制到给定的缓冲区。如果注释大小大于给定缓 冲区,则只会复制适合该缓冲区的字节数。 “样本”文件夹的 2DGL_DrawGIF.c 文件显示了如何使用该函数。 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 159 GUI_GIF_GetCommentEx() 描述 返回不必加载到存储器的 GIF 图像的给定注释。 原型 int GUI_GIF_GetCommentEx(GUI_GET_DATA_FUNC * pfGetData, void * p, U8 * pBuffer, int MaxSize, int Index); 参数 pfGetData p pBuffer MaxSize Index 描述 指向获取数据调用的函数。更多 GetData 函数的详细信息,请参阅“使用 ...Ex() 函数获取数据”(第 167 页)。 传递到 pfGetData 所指函数的 Void 指针。 指向填充了注释的缓冲区。 缓冲区的大小。 要返回的注释基于 0 的索引。 返回值 0 表示成功, != 0 表示错误。 其他信息 更多详细信息,请参阅 “GUI_GIF_GetComment()”(第 158 页)。 GUI_GIF_GetImageInfo() 描述 返回已加载到存储器的 GIF 文件给定子图像的相关信息。 原型 int GUI_GIF_GetImageInfo(const void * pGIF, U32 NumBytes, GUI_GIF_IMAGE_INFO * pInfo, int Index); 参数 pGIF NumBytes pInfo Index 描述 指向 gif 文件所在的存储器区域的起始位置。 Gif 文件的字节数。 指向该函数要填充的 GUI_GIF_IMAGE_INFO 结构。 子图像基于 0 的索引。 返回值 0 表示成功, != 0 表示错误。 GUI_GIF_IMAGE_INFO 的元素 数据类型 元素 描述 int int int int int xPos yPos xSize ySize Delay 上次所绘制图像的 X 位置。 上次所绘制图像的 Y 位置。 上次所绘制图像的 X 大小。 上次所绘制图像的 Y 大小。 图像应在电影中显示的时间 (1/100 秒)。 其他信息 如果需要将图像作为电影显示,则应使用此函数获取子图像可见的时间以及下一个子图像显示的时间。 如果 Delay 元素为 0,则图像可见的时间应为 1/10 秒。 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 160 章节 显示位图文件 GUI_GIF_GetImageInfoEx() 描述 返回无需加载到存储器的 GIF 文件给定子图像的相关信息。 原型 int GUI_GIF_GetImageInfoEx(GUI_GET_DATA_FUNC * pfGetData, void * p, GUI_GIF_IMAGE_INFO * pInfo, int Index); 参数 pfGetData p pInfo Index 描述 指向获取数据调用的函数。更多 GetData 函数的详细信息,请参阅“使用 ...Ex() 函数获取数据”(第 167 页)。 传递到 pfGetData 所指函数的 Void 指针。 指向该函数要填充的 GUI_GIF_IMAGE_INFO 结构。 子图像基于 0 的索引。 返回值 0 表示成功, != 0 表示错误。 其他信息 更多详细信息,请参阅 “GUI_GIF_GetImageInfo()”(第 159 页)。 GUI_GIF_GetInfo() 描述 返回已加载到存储器的给定 GIF 文件的子图像的信息结构,包含子图像的大小和数量等相关信息。 原型 int GUI_GIF_GetInfo(const void * pGIF, U32 NumBytes, GUI_GIF_INFO * pInfo); 参数 pGIF NumBytes pInfo 描述 指向 gif 文件所在的存储器区域的起始位置。 Gif 文件的字节数。 指向此函数要填充的 GUI_GIF_INFO 结构。 返回值 0 表示成功, != 0 表示错误。 GUI_GIF_INFO 的元素 数据类型 int int int 元素 XSize YSize NumImages 图像的 X 像素大小。 图像的 Y 像素大小。 文件中的子图像数。 描述 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 161 GUI_GIF_GetInfoEx() 描述 返回无需加载到存储器的给定 GIF 文件的子图像的信息结构,包含子图像的大小和数量等相关信息。 原型 int GUI_GIF_GetInfoEx(GUI_GET_DATA_FUNC * pfGetData, void * p, GUI_GIF_INFO * pInfo);; 参数 pfGetData p pInfo 描述 指向获取数据调用的函数。更多 GetData 函数的详细信息,请参阅“使用 ...Ex() 函数获取数据”(第 167 页)。 传递到 pfGetData 所指函数的 Void 指针。 指向此函数要填充的 GUI_GIF_INFO 结构。 返回值 0 表示成功, != 0 表示错误。 GUI_GIF_INFO 的元素 数据类型 int int int 元素 XSize YSize NumImages 图像的 X 像素大小。 图像的 Y 像素大小。 文件中的子图像数。 GUI_GIF_GetXSize() 描述 返回已加载到存储器的指定 GIF 图像的 X 大小。 原型 int GUI_GIF_GetXSize(const void * pGIF); 描述 参数 pGIF 描述 指向 gif 文件所在的存储器区域的起始位置。 返回值 GIF 图像的 X 大小。 GUI_GIF_GetXSizeEx() 描述 返回无需加载到存储器的 GIF 图像的 X 大小。 原型 int GUI_GIF_GetXSizeEx(GUI_GET_DATA_FUNC * pfGetData, void * p); 参数 pfGetData p 描述 指向获取数据调用的函数。更多 GetData 函数的详细信息,请参阅“使用 ...Ex() 函数获取数据”(第 167 页)。 传递到 pfGetData 所指函数的 Void 指针。 返回值 GIF 图像的 X 大小。 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 162 章节 显示位图文件 GUI_GIF_GetYSize() 描述 返回已加载到存储器的指定 GIF 图像的 Y 大小。 原型 int GUI_GIF_GetYSize(const void * pGIF);; 参数 pGIF 描述 指向 bmp 文件所在的存储器区域的起始位置。 返回值 GIF 图像的 Y 大小。 GUI_GIF_GetYSizeEx() 描述 返回无需加载到存储器的 GIF 图像的 Y 大小。 原型 int GUI_GIF_GetYSizeEx(GUI_GET_DATA_FUNC * pfGetData, void * p); 参数 pfGetData p 描述 指向获取数据调用的函数。更多 GetData 函数的详细信息,请参阅“使用 ...Ex() 函数获取数据”(第 167 页)。 传递到 pfGetData 所指函数的 Void 指针。 返回值 GIF 图像的 Y 大小。 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 163 8.4 PNG 文件支持 PNG (可移植的网络图形)格式是一种图像格式,它利用非专利的数据压缩方法提供无损的数据压缩 和 Alpha 混合。 PNG 1.0 版规范于 1996 年发布。到 2003 年末, PNG 成为国际标准 (ISO/IEC 15948)。 emWin 对 PNG 支持的实施基于来自 Glenn Randers-Pehrson、Guy Eric Schalnat 和 Andreas Dilger 的 “libpng”库,该库可在 www.libpng.org 下免费获得。 emWin 对该库的使用符合 GUI\PNG\png.h 中的版权通知,通知中允许使用该库,而没有任何限制。 emWin 的 PNG 库可从 www.segger.com/link/emwin_png.zip 获得。 8.4.1 将 PNG 文件转换为 C 源 某些情况下,将 PNG 文件作为 C 文件添加到项目中非常有用。对此,可完全按照前面介绍的“JPEG 文件支持”下的相同方式来执行。此外,位图转换器能够加载 PNG 文件并将它们转换为 C 位图文件。 8.4.2 显示 PNG 文件 图形库首先对图形信息进行解码。如果必须绘制图像,解码流程将花费相当长的时间。如果在窗口管 理器经常调用的 callback 例程中使用 PNG 文件,则解码流程可能花费相当长的时间。通过使用存储 设备可缩短计算时间。最好的方法是先将图像绘制到存储设备中。在这种情况下,将只进行一次解压 缩。更多关于存储设备的信息,请参见 “存储设备”(第 247 页)。 8.4.3 存储器使用 PNG 解压缩大约需要 21 Kb RAM 用于与图像大小无关的解压缩和依赖大小的字节量。RAM 要求可 按以下方式计算: 大约 RAM 要求 = (X-Size + 1)* Y 大小 * 4 + 21Kbytes 8.4.4 PNG 文件 API 下表按字母顺序列出了可用的 PNG 文件相关的例程。以下为详细描述:# 例程 GUI_PNG_Draw() GUI_PNG_DrawEx() GUI_PNG_GetXSize() GUI_PNG_GetXSizeEx() GUI_PNG_GetYSize() GUI_PNG_GetYSizeEx() 描述 绘制已加载到存储器的 PNG 文件。 绘制无需加载到存储器的 PNG 文件。 返回加载到存储器的位图的 X 大小。 返回无需加载到存储器的位图的 X 大小。 返回加载到存储器的位图的 Y 大小。 返回无需加载到存储器的位图的 Y 大小。 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 164 章节 显示位图文件 GUI_PNG_Draw() 描述 在当前窗口中的指定位置绘制已加载到存储器的 png 文件。 原型 int GUI_PNG_Draw(const void * pFileData, int FileSize, int x0, int y0); 参数 pFileData FileSize x0 y0 描述 指向 png 文件所在的存储器区域的起始位置。 png 文件的字节数。 显示器中位图左上角的 X 位置。 显示器中位图左上角的 Y 位置。 返回值 0 表示成功,非 0 表示该函数失败。(当前的实施始终返回 0) 其他信息 “样本”文件夹中包含示例 2DGL_DrawPNG.c,它显示了如何使用该函数。 GUI_PNG_DrawEx() 描述 在当前窗口中的指定位置绘制不必加载到存储器的 png 文件。 原型 int GUI_PNG_DrawEx(GUI_GET_DATA_FUNC * pfGetData, void * p, int x0, int y0); 参数 pfGetData p x0 y0 描述 指向获取数据调用的函数。更多 GetData 函数的详细信息,请参阅“使用 ...Ex() 函数获取数据”(第 167 页)。 传递到 pfGetData 所指函数的 Void 指针。 显示器中位图左上角的 X 位置。 显示器中位图左上角的 Y 位置。 返回值 0 表示成功,非 0 表示该函数失败。 其他信息 如果存储器没有足够的 RAM 加载整个文件,可使用此函数来绘制 png 文件。然后,PNG 库会调用参 数 pfGetData 所指的函数来读取数据。 GetData 函数应返回可用的字节数。这可能小于或等于请求的字节数。该函数至少需要返回 1 个新 字节。请注意, PNG 库会在内部为整个图像分配缓冲区。使用此函数无法避免此操作。 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 165 GUI_PNG_GetXSize() 描述 返回已加载到存储器的指定 PNG 图像的 X 大小。 原型 int GUI_PNG_GetXSize(const void * pFileData, int FileSize); 参数 pFileData FileSize 描述 指向 png 文件所在的存储器区域的起始位置。 文件的大小 (字节)。 返回值 PNG 图像的 X 大小。 GUI_PNG_GetXSizeEx() 描述 返回无需加载到存储器的 PNG 图像的 X 大小。 原型 int GUI_PNG_GetXSizeEx(GUI_GET_DATA_FUNC * pfGetData, void * p); 参数 pfGetData p 描述 指向获取数据调用的函数。更多 GetData 函数的详细信息,请参阅“使用 ...Ex() 函数获取数据”(第 167 页)。 传递到 pfGetData 所指函数的 Void 指针。 返回值 PNG 图像的 X 大小。 GUI_PNG_GetYSize() 描述 返回已加载到存储器的指定 PNG 图像的 Y 大小。 原型 int GUI_PNG_GetYSize(const void * pFileData, int FileSize); 参数 pFileData FileSize 描述 指向 png 文件所在的存储器区域的起始位置。 文件的大小 (字节)。 返回值 PNG 图像的 Y 大小。 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 166 章节 显示位图文件 GUI_PNG_GetYSizeEx() 描述 返回无需加载到存储器的 PNG 图像的 X 大小。 原型 int GUI_PNG_GetYSizeEx(GUI_GET_DATA_FUNC * pfGetData, void * p); 参数 pfGetData p 描述 指向获取数据调用的函数。更多 GetData 函数的详细信息,请参阅“使用 ...Ex() 函数获取数据”(第 167 页)。 传递到 pfGetData 所指函数的 Void 指针。 返回值 PNG 图像的 Y 大小。 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 167 8.5 使用 ...Ex() 函数获取数据 同流位图一样,使用 BMP、 GIF、 JPEG 和 PNG 文件也能够运行,而不必将整个图像加载到 RAM。对 于此种情况,可使用 ...Ex() 函数。所有这些函数的共同之处在于都使用 “GetData”函数。请注意, 根据使用 “GetData”函数的实际任务不同,该函数的运行也稍有差异。请参见以下参数和示例表。 “GetData”函数的原型 int GUI_GET_DATA_FUNC(void * p, const U8 * * ppData, unsigned NumBytes, U32 Off) 参数 p ppData NumBytesReq StartOfFile 描述 应用程序定义的 Void 指针。 BMP、 GIF 和 JPEG: 指向到 U8 的指针。“GetData”函数必须将指针设置到请求数据所在的位置。 流位图和 PNG: 指向 U8。必须使用 “GetData”函数填充指针指向的位置。 请求的字节数。 如果此标记为 1,应将数据指针设置到数据流的起始位置。 示例 (BMP、 GIF 和 JPEG) 下列代码节选显示了如何实施 “GetData”函数以用于 BMP、 GIF 和 JPEG 数据: static char _acBuffer[0x200]; int APP_GetData(void * p, const U8 * * ppData, unsigned NumBytesReq, U32 Off) { HANDLE * phFile; DWORD NumBytesRead; phFile = (HANDLE *)p; // // Check buffer size // if (NumBytesReq > sizeof(_acBuffer)) { NumBytesReq = sizeof(_acBuffer); } // // Set file pointer to the required position // SetFilePointer(*phFile, Off, 0, FILE_BEGIN); // // Read data into buffer // ReadFile(*phFile, _acBuffer, NumBytesReq, &NumBytesRead, NULL); // // Set data pointer to the beginning of the buffer // *ppData = _acBuffer; // // Return number of available bytes // return NumBytesRead; } emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 168 章节 显示位图文件 示例 (PNG 和流位图) 以下代码节选显示了如何实施 “GetData”函数以用于 PNG 和流位图数据: static char acBuffer[0x200]; int APP_GetData(void * p, const U8 * * ppData, unsigned NumBytesReq, U32 Off) { HANDLE * phFile; DWORD NumBytesRead; U8 * pData; pData = (U8 *)*ppData; phFile = (HANDLE *)p; // // Set file pointer to the required position // SetFilePointer(*phFile, Off, 0, FILE_BEGIN); // // Read data into buffer // ReadFile(*phFile, pData, NumBytesReq, &NumBytesRead, NULL); // // Return number of available bytes // return NumBytesRead; } emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 169 第9章 字体 本章介绍 emWin 中字体支持的各种方法。 emWin 随附的最常用的字体为 C 字体文件。所有文件均 包含 ASCII 字符集,大部分文件还包含 ISO 8859-1 字符。实际上,您可能会发现这些字体足够支 持您的应用。有关各种字体的详细信息,请参阅 “标准字体”(第 192 页)。 emWin 采用 8 位字符编译,最多允许 256 种不同的字符代码,其中前 32 中将保留作为控制字符。 可用的字符取决于所选的字体。 为访问含 65536 种可能字符的完整的 Unicode 区域, emWin 支持 UTF8 解码,在 “外语支持” (第 801 页)中对此进行了介绍。 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 170 章节 字体 9.1 简介 字体支持的第一种方法是,可以使用字体定义中含每个字符的 1 bpp 像素信息位图的 C 文件。这种 字体支持仅限于使用应用编译的字体。 随着时间推移,字体支持在字体质量、 ROM 要求、性能、可扩展性和运行时添加更多字体的能力方 面进行了改进。 同时, emWin 字体包含抗锯齿、复合字符的图样 (例如泰语中的要求)、位于外部非可寻址介质中 的字体以及 TrueType 支持。除 TrueType 字体 (矢量字体)格式外,所有其他字体均为位图字体。 9.2 字体类型 emWin 支持自行定义的内部类型不同的字体以及常用的 TrueType 字体。 等宽位图字体 等宽位图字体的每个字符大小相同。在比例字体中,每个字符有自己的宽度,而等宽字体的宽度只需 定义一次。像素信息保存为 1 bpp,涵盖整个字符区域。 比例位图字体 比例位图字体的每个字符高度相同、宽度可能不同。像素信息保存为 1 bpp,涵盖整个字符区域。 抗锯齿字体,包含 2 bpp 抗锯齿信息 每个字符高度相同、宽度可能不同。像素信息保存为 2 bpp 抗锯齿信息,涵盖整个字符区域。 抗锯齿字体,包含 4 bpp 抗锯齿信息 每个字符高度相同、宽度可能不同。像素信息保存为 4 bpp 抗锯齿信息,涵盖整个字符区域。 扩展比例位图字体 扩展比例位图字体的每个字符拥有自己的高度和宽度。像素信息保存为 1 bpp,仅涵盖字形位图区域。 扩展比例位图字体,包含 2 bpp 抗锯齿信息 每个字符高度相同、宽度可能不同。像素信息保存为 2 bpp 抗锯齿信息,仅涵盖字形位图区域。 扩展比例位图字体,包含 4 bpp 抗锯齿信息 每个字符高度相同、宽度可能不同。像素信息保存为 4 bpp 抗锯齿信息,仅涵盖字形位图区域。 扩展比例位图字体,带边框 在某些情况下 (例如编译时背景颜色未知),可以使用带边框的字体。带边框的字体始终在透明模式 下绘制,与当前设置无关。字符像素按当前所选的前景颜色绘制,边框按背景颜色绘制。前景颜色和 背景颜色之间明显的对比可以确保能够阅读文本,而与背景无关。 请注意,这种类型的字体不适用于复合字符,例如泰语。另外,也不适用于 Arabic 字体。以下图片 显示了照片前某些带边框的文本: emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 字体类型表 下表显示了各字体类型之间的差异。图片仅显示字体文件中保存的像素信息: 比例位图字体 比例位图字体, 比例位图字体, AA2 AA2 扩展比例位图 字体 171 扩展比例位图 字体,带边框 扩展比例位图 字体, AA2 扩展比例位图 字体, AA4 TrueType 矢量字体 emWin 的 TrueType 字体支持表示,支持本章后面部分介绍的 TrueType 字体文件格式。 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 172 章节 字体 9.3 字体格式 下面解释了所支持的字体格式之间的差异、何时使用它们以及使用它们的要求。 9.3.1 C 文件格式 这是最常见的字体使用方式。使用 C 文件格式的字体时,我们建议作为库模块来编译所有可用的字体 和链接它们,或将所有字体对象文件置于您可以链接到应用的库中。这样,可确保实际只链接了您的 应用所需的字体。可以使用字体转换器 (将在单独手册中介绍)来创建其他字体。 何时使用 在编译时字体已知以及对于字体数据拥有足够的可寻址内存的情况下,可以使用这种格式。 要求 为了能够在应用中使用字体 C 文件,必须满足以下要求: • 字体文件为与 emWin 兼容的 C 文件、对象文件或库格式。 • 字体文件与您的应用链接。 • 应用中包含字体声明。 格式说明 字体 C 文件首先包含字体所含全部字符的像素信息。之后,是有关每个字符大小信息的字符信息表。 此表之后是字体文件中所含各个字符相邻区域的范围信息结构,而每个结构均指向下一个结构。请注 意,如果使用许多单独的字符,这种方法可以大幅扩展字体文件。在范围信息结构之后,是 GUI_FONT 结构,其中包含字体的类型、像素大小等主要信息。 9.3.2 系统独立字体 (SIF) 格式 系统独立字体是包含字体信息的二进制数据块。可以使用字体转换器来创建系统独立字体。此工具不 在基本封装之列。本章后面将对此进行简单的介绍。 何时使用 在编译时字体未知以及对于字体数据拥有足够的可寻址内存的情况下,可以使用这种格式。 要求 为了能够在应用中使用 SIF 字体文件,需要在可寻址存储器 (ROM 或 RAM)中保存整个文件。 格式说明 SIF 文件的结构与 C 文件大致相同。它在二进制格式中包含相同的信息。文件要素的顺序反之亦然: 常规字体信息,之后是范围信息结构、字符信息表和所有字符的最小像素信息。 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 173 9.3.3 外部位图字体 (XBF) 格式 同 SIF 字体一样,XBF 字体也是包含字体信息的二进制数据块,并且可以使用字体转换器来创建 XBF 文件。字体转换器不在 emWin 基本封装之列。有关如何创建外部二进制字体的详细信息,请参阅字 体转换器文档。 与其他字体不同的是,XBF 字体在使用时不必位于存储器中,而 emWin 的所有其他字体均需要完全 驻存在存储器中。 XBF 字体文件在使用时可保存在任意外部介质中。通过 “GetData”回调函数可 以进行数据访问,而所有其他字体都需要驻存在可寻址存储器 (RAM 或 ROM)中。 XBF 字体的优 势在于,可以在内存很小的系统上使用非常大的字体。 何时使用 如果对于字体数据没有足够的可寻址内存,并且可以使用任何其他种类的外部介质来存储字体的情况 下,可以使用这种格式。 要求 为了能够在应用中使用 XBF 字体,需要使用 “GetData”回调函数来负责获取字体数据。 格式说明 这种格式总体上与 SIF 和 C 文件格式有所不同。首先,它包含小块常规字体信息,其中包含最低和最 高的字符代码。之后,是包含最低和最高字符代码之间每个字符的偏移和数据大小信息的访问表。如 果不存在字符,则相应字符的此信息为零。访问表之后是所有字符的字符信息,包含像素数据和字符 大小信息。 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 174 章节 字体 9.3.4 TrueType 字体 (TTF) 格式 TrueType 是 Apple Computer 开发的轮廓字体标准。它为字体开发人员提供对在各种字体高度下 字体显示方式的高度控制。与位图字体(基于每个字符的位图)不同,TrueType 字体基于矢量图形。 矢量表示的优势在于无损的可扩展性。 这意味着,每个字符在绘制前需要光栅化为位图。为避免每次绘制字符时都进行光栅化,通常用字体 引擎缓存位图数据。这要求 CPU 速度快、 RAM 足够。 发货时不含 emWin TTF 包。该项内容可在 www.segger.com/link/emwin_freetype.zip 下免费 获得。 许可 emWin对TTF支持的实施基于来自David Turner、Robert Wilhelm和Werner Lembergr的FreeType 字体库,该库可在 www.freetype.org 下免费获得。emWin 对该库的使用符合 GUI\TrueType\FTL.txt 下的 FreeType 许可。 emWin 对该库进行了少许改编,添加了带有 GUI 函数的 “粘贴”层。 何时使用 如果在运行时需要对字体进行缩放,可使用这种格式。 要求 • CPU:TTF 支持仅适用于 32 位 CPU。我们对 32 位 CPU 的定义为:sizeof(int) = 4。 • ROM:TTF 引擎的 ROM 要求大约为 250 K。确切大小取决于 CPU、编译器以及编译器的优化 水平。 • RAM:该库的 RAM 要求主要取决于使用的字体。TTF 引擎的基本 RAM 要求大约为 50 K。在使 用 GUI_TTF_CreateFont() 创建 GUI 字体时,字体引擎会加载生成字符所需的 TTF 文件中 定义的所有字体表。不同字体之间的表大小有所差异。创建字体额外要求的 RAM 量可能介于几 个 KB 到 1 MB 以上之间。一般字体需要 80-300 kb。取决于使用的字体文件需要多少 RAM。 至少,TTF 引擎需要位图缓存。默认情况下,引擎使用 200 K 的缓存。足够大多数应用使用。 TTF 引擎通过非 emWin 函数 malloc() 和 free() 分配内存。使用 TTF 引擎之前,必须确保 能够运行这些函数。 格式说明 有关 TTF 格式的详细信息,请参阅 www.apple.com 下可用的信息。 9.4 将 TTF 文件转换为 C 源 某些情况下,将 TTF 文件作为 “C” 文件添加到项目中非常有用,例如在没有文件系统可用时。使用 emWin 随附的工具 Bin2C.exe 可完成此任务。在 “工具”子文件夹中可找到该工具。它可以将给 定的二进制文件 (在本例中为 TTF 文件)转换为 “C” 文件。 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 175 9.5 声明自定义字体 声明自定义字体原型最推荐的方法是将它们置于应用定义的头文件中。使用这些字体的每个应用源文 件中均应包含此内容。如以下示例所示: #include "GUI.h" extern GUI_CONST_STORAGE GUI_FONT GUI_FontApp1; extern GUI_CONST_STORAGE GUI_FONT GUI_FontApp2; 请注意,如果这些字体要用于 BUTTON_FONT_DEFAULT 或类似的 emWin 配置宏,这种声明原型不 起作用。在这种情况下,字体需要在配置文件 GUIConf.h 中声明。这种情况下的声明如以下示例所示: typedef struct GUI_FONT GUI_FONT; extern const GUI_FONT GUI_FontApp1; #define BUTTON_FONT_DEFAULT &GUI_FontApp1 #define EDIT_FONT_DEFAULT &GUI_FontApp1 由于前面 emWin 包含 GUIConf.h 的位置未定义 GUI_FONT 结构,所以需要类型定义符 (typedef )。 9.6 选择字体 emWin 提供不同的字体,始终选择其中之一。通过调用函数 GUI_SetFont() 或 GUI_XXX_CreateFont() 函数之一可更改此选项,它们将选择用于当前任务所有文本输出的字体。 如果您的应用没有选择任何字体,则将使用默认字体。默认字体在 GUIConf.h 中配置,且可以更改。您 应确保默认字体是在应用中实际使用的字体,因为默认字体将链接到您的应用,因而占用 ROM 内存。 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 176 章节 字体 9.7 字体 API 下表按字母顺序列出了各自类别内可用的与字体相关的例程。有关详细描述,请参阅后面的章节。 例程 描述 C 文件相关的字体函数 GUI_SetDefaultFont() 设置默认字体 GUI_SetFont() 设置当前字体 “SIF”文件相关的字体函数 GUI_SIF_CreateFont() GUI_SIF_DeleteFont() 通过将指针传递至系统独立字体数据创建和选择字体。 删除使用 GUI_SIF_CreateFont() 创建的字体 “TTF”文件相关的字体函数 GUI_TTF_CreateFont() GUI_TTF_DestroyCache() GUI_TTF_Done() 基于 TTF 字体文件创建 GUI 字体。 解除 TTF 引擎的缓存。 释放 TTF 引擎动态分配的所有内存。 GUI_TTF_GetFamilyName() 返回字体的系列名称。 GUI_TTF_GetStyleName() GUI_TTF_SetCacheSize() 返回字体的样式名称。 可用于设置 TTF 缓存的默认大小。 “XBF”文件相关的字体函数 GUI_XBF_CreateFont() GUI_XBF_DeleteFont() 通过将指针传递至负责从 XBF 字体文件获取数据的回调函数创建和选择字体。 删除使用 GUI_XBF_CreateFont() 创建的字体 常见字体相关的函数 GUI_GetCharDistX() 返回当前字体中指定字符的宽度像素 (X 大小)。 GUI_GetFont() GUI_GetFontDistY() GUI_GetFontInfo() GUI_GetFontSizeY() 返回当前选择的字体的指针。 返回当前字体的 Y 间距。 返回包含字体信息的结构。 返回当前字体的高度像素 (Y 大小)。 GUI_GetLeadingBlankCols() 返回给定字符的前导空格像素列数。 GUI_GetStringDistX() 返回使用当前字体的文本的 X 大小。 GUI_GetTextExtend() 评估使用当前字体的文本的大小。 GUI_GetTrailingBlankCols() 返回给定字符的后导空格像素列数。 GUI_GetYDistOfFont() 返回特定字体的 Y 间距。 GUI_GetYSizeOfFont() 返回特定字体的 Y 大小。 GUI_IsInFont() GUI_SetDefaultFont() 评估特定字体中是否存在指定的字符。 设置 GUI_Init() 之后使用的默认字体。 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 177 9.8 C 文件相关的字体函数 GUI_SetDefaultFont() 描述 设置文本输出默认情况下使用的字体。 原型 void GUI_SetDefaultFont(const GUI_FONT GUI_UNI_PTR * pFont); 参数 pFont 指向默认情况下选择的字体。 描述 其他信息 此函数旨在用于 GUI_X_Config()。定义 GUI_DEFAULT_FONT 不再是必需的。如果既没有定义 GUI_DEFAULT_FONT,也没有调用 GUI_SetDefaultFont,则会将 GUI_Font6x8 设置为默认字 体。如果不使用任何 emWin 字体,则 GUI_DEFAULT_FONT 必需定义为 NULL,并需要使用此函 数将自定义字体设为默认。 GUI_SetFont() 描述 设置文本输出使用的字体。 原型 const GUI_FONT * GUI_SetFont(const GUI_FONT * pNewFont); 参数 pFont 指向要选择和使用的字体。 描述 返回值 返回之前选择的字体的指针以便进行缓冲。 示例 使用 3 种不同的大小显示示例文本,然后恢复之前的字体: const GUI_FONT GUI_FLASH * OldFont; OldFont = GUI_SetFont(&GUI_Font8x16); // Buffer old font GUI_DispStringAt("This text is 8 by 16 pixels",0,0); GUI_SetFont(&GUI_Font6x8); GUI_DispStringAt("This text is 6 by 8 pixels",0,20); GUI_SetFont(&GUI_Font8); GUI_DispStringAt("This text is proportional",0,40); GUI_SetFont(OldFont); // Restore old font 上述示例的屏幕截图: 使用不同的字体显示文本和值: GUI_SetFont(&GUI_Font6x8); GUI_DispString("The result is:"); // Disp text GUI_SetFont(&GUI_Font8x8); GUI_DispDec(42,2); // Disp value 上述示例的屏幕截图: emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 178 章节 字体 9.9 “SIF”文件相关的字体函数 GUI_SIF_CreateFont() 描述 通过将指针传递至系统独立字体数据设置使用的字体。 原型 void GUI_SIF_CreateFont(void * pFontData, GUI_FONT * pFont, const GUI_SIF_TYPE * pFontType); 参数 pFontData pFont pFontType 描述 指向系统独立字体数据。 指向 RAM 中由该函数填充的 GUI_FONT 结构。 请参见下表。 元素 pFontType 的允许值 GUI_SIF_TYPE_PROP GUI_SIF_TYPE_PROP_EXT GUI_SIF_TYPE_PROP_FRM GUI_SIF_TYPE_PROP_AA2 GUI_SIF_TYPE_PROP_AA4 GUI_SIF_TYPE_PROP_AA2_EXT GUI_SIF_TYPE_PROP_AA4_EXT 在参数 pFont 指向比例字体时使用。 在参数 pFont 指向扩展比例字体时使用。 在参数 pFont 指向扩展带边框比例字体时使用。 在参数 pFont 指向使用 2 bpp 抗锯齿的比例字体 时使用。 在参数 pFont 指向使用 4 bpp 抗锯齿的比例字体 时使用。 在参数 pFont 指向使用 2 bpp 抗锯齿的扩展比例 字体时使用。 在参数 pFont 指向使用 4 bpp 抗锯齿的扩展比例 字体时使用。 其他信息 与必须编译和链接应用程序的 emWin 标准字体不同,系统独立字体 (SIF) 是包含字体信息的二进制 数据块。可以使用字体转换器来创建系统独立字体。此工具不在基本封装之列。本章后面将对此进行 简单的介绍。有关如何创建系统独立字体的详细信息,请参阅字体转换器文档。 使用此函数时, emWin 需要用字体信息填充 GUI_FONT 结构。在参数 pFont 中,用户需要将指针 传递至此结构。此结构的内容在字体使用期间必须保持有效。 该函数不知道应创建何种字体。要告知函数创建的字体类型,必须在参数 pFontType 中进行传递。 这样,可避免链接不需要的代码。 示例 static GUI_FONT _Font; /* Font structure in RAM */ void main(void) { GUI_Init(); GUI_SIF_CreateFont(_DownloadedFont, &_Font, GUI_SIF_TYPE_PROP); GUI_DispString("Hello World!"); while (1) { GUI_Exec(); } } emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 179 GUI_SIF_DeleteFont() 描述 删除参数 pFont 指示的字体。 原型 void GUI_SIF_DeleteFont(GUI_FONT * pFont); 参数 pFont 指向要删除的字体。 描述 其他信息 使用 GUI_SIF_CreateFont() 创建的字体后,如果不再使用该字体,应将其删除。 示例 GUI_FONT _Font; /* Font structure in RAM */ GUI_SIF_CreateFont(_DownloadedFont, &_Font, GUI_SIF_TYPE_PROP); /* Use the font */ GUI_SIF_DeleteFont(&_Font); 9.10 “TTF”文件相关的字体函数 emWin 对 TTF 文件支持的实施基于来自 David Turner、 Robert Wilhelm 和 Werner Lemberg 的 FreeType 字体库。更多详细信息,请参阅 “TrueType 字体 (TTF) 格式”(第 174 页)。 GUI_TTF_CreateFont() 描述 使用 TTF 字体文件创建和选择 emWin 字体。 原型 int GUI_TTF_CreateFont(GUI_FONT * pFont, GUI_TTF_CS * pCS); 参数 pFont pCS 描述 指向 RAM 中由该函数填充的 GUI_FONT 结构。 指向包含创建参数的 GUI_TTF_CS 结构。 返回值 0 表示成功, 1 表示错误。 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 180 章节 字体 GUI_TTF_CS 的元素 数据类型 元素 GUI_TTF_DATA * pTTF PixelHeight PixelHeight FaceIndex FaceIndex GUI_TTF_DATA 的元素 描述 指向包含要使用的字体文件位置和大小的 GUI_TTF_DATA 结构。 新字体的像素高度。表示字形 “g”和 “f”之间周围矩形的高度。请注 意,这并非两行文本之间的距离。换句话说, GUI_GetFontSizeY() 返回的值与此值并不完全相同。 有些字体文件可能包含多种字体风格。对于多种风格,此索引指定使用 基于零的风格索引来创建字体。通常为 0。 数据类型 元素 描述 const void * NumBytes pData NumBytes 指向可寻址存储器区域中的 TTF 字体文件。 文件的大小 (字节)。 其他信息 第一次使用该函数时,它会对 TTF 引擎和内部缓存系统进行初始化。如果缓存需要使用默认定义 的 其 他 值,则 需 要 在 首 次 调 用 此 函 数 之 前 进 行 配 置。有 关 如 何 配 置 缓 存 的 详 细 信 息,请 参 阅 “GUI_TTF_SetCacheSize()”(第 182 页)。 内部数据缓存管理创建字体和缓存位图数据的整个机制。字体风格在缓存中按参数 pTTF 和 FaceIndex 中给定的地址进行唯一标识,通常为 0。例如,如果应使用相同的字体文件来创建不同大小的字体,则 参数 pTTF 应指向 GUI_TTF_DATA 结构的相同位置。 参数 PixelHeight 指定字形 “g”和 “f”之间周围矩形的高度。请注意 PixelHeight 的值与一 行文本到另一行文本之间的偏移量不同。 示例 GUI_TTF_CS Cs0, Cs1; GUI_TTF_DATA Data; GUI_FONT Font0, Font1; /* Set parameters for accessing the font file */ Data.pData = aTTF; /* Address */ Data.NumBytes = sizeof(aTTF); /* Size */ /* Set creation parameters of first font */ Cs0.pTTF = &Data; /* Use address of GUI_TTF_DATA */ Cs0.PixelHeight = 24; /* Pixel height */ Cs0.FaceIndex = 0; /* Initialize to 0 */ /* Set creation parameters of second font */ Cs1.pTTF = &Data; /* Use address of GUI_TTF_DATA */ Cs1.PixelHeight = 48; /* Pixel height */ Cs1.FaceIndex = 0; /* Initialize to 0 */ /* Create 2 fonts */ GUI_TTF_CreateFont(&Font0, &Cs0); GUI_TTF_CreateFont(&Font1, &Cs1); /* Draw something using the fonts */ GUI_SetFont(&Font0); GUI_DispString("Hello world\n"); GUI_SetFont(&Font1); GUI_DispString("Hello world"); emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 181 GUI_TTF_DestroyCache() 描述 此函数会释放 TTF 缓存系统分配的所有内存并解除该缓存。 原型 void GUI_TTF_DestroyCache(void); 其他信息 下次使用 GUI_TTF_CreateFont() 时, emWin 将自动创建和初始化新的缓存。 GUI_TTF_Done() 描述 此函数会释放 TTF 引擎及其内部缓存系统分配的所有内存。 原型 void GUI_TTF_Done(void); 其他信息 下次使用 GUI_TTF_CreateFont() 时,emWin 将自动初始化 TTF 引擎,并创建和初始化新的缓存。 GUI_TTF_GetFamilyName() 描述 此函数将返回字体文件中定义的字体系列名称。 原型 int GUI_TTF_GetFamilyName(GUI_FONT * pFont, char * pBuffer, int NumBytes); 参数 pFont pBuffer NumBytes 描述 指向使用 GUI_TTF_CreateFont() 创建的 GUI_FONT 结构。 要填充系列名称的缓冲区。 缓冲区的大小 (字节)。 返回值 0 表示成功, 1 表示错误。 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 182 章节 字体 GUI_TTF_GetStyleName() 描述 此函数将返回字体文件中定义的样式名称 (粗体、常规等)。 原型 int GUI_TTF_GetStyleName(GUI_FONT * pFont, char * pBuffer, int NumBytes); 参数 pFont pBuffer NumBytes 描述 指向使用 GUI_TTF_CreateFont() 创建的 GUI_FONT 结构。 要填充样式名称的缓冲区。 缓冲区的大小 (字节)。 返回值 0 表示成功, 1 表示错误。 GUI_TTF_SetCacheSize() 描述 设置第一次调用 GUI_TTF_CreateFont() 时用于创建缓存的大小参数。 原型 void GUI_TTF_SetCacheSize(unsigned MaxFaces, unsigned MaxSizes, U32 MaxBytes); 参数 MaxFaces MaxSizes MaxBytes 描述 缓存应能够同时处理的最大字体风格数。 0 选择默认值。 缓存应能够同时处理的最大字体对象数。 0 选择默认值。 位图缓存使用的最大字节数。 0 选择默认值。 其他信息 例如,如果应使用 3 种字体风格,每种有 2 种大小,则缓存应能够处理 6 种字体对象。 TTF 引擎使用的默认值是:2 种风格、 4 种大小对象和 200 K 位图数据缓存。 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 183 9.11 “XBF”文件相关的字体函数 GUI_XBF_CreateFont() 描述 通过将指针传递至负责从 XBF 字体文件获取数据的回调函数创建和选择字体。 原型 int GUI_XBF_CreateFont(GUI_FONT * pFont, GUI_XBF_DATA * pXBF_Data, const GUI_XBF_TYPE * pFontType, GUI_XBF_GET_DATA_FUNC * pfGetData, void * pVoid); 参数 pFont pXBF_Data pFontType pfGetData pVoid 描述 指向 RAM 中由该函数填充的 GUI_FONT 结构。 指向 RAM 中由该函数填充的 GUI_XBF_DATA 结构。 请参见下表。 指向负责从字体文件获取数据的回调函数。请参见以下原型。 传递到 “GetData”回调函数的应用定义的指针。 元素 pFontType 的允许值 GUI_XBF_TYPE_PROP GUI_XBF_TYPE_PROP_EXT GUI_XBF_TYPE_PROP_FRM GUI_XBF_TYPE_PROP_AA2_EXT GUI_XBF_TYPE_PROP_AA4_EXT 在参数 pFont 指向比例字体时使用。 在参数 pFont 指向扩展比例字体时使用。 在参数 pFont 指向扩展带边框比例字体时使用。 在参数 pFont 指向使用 2 bpp 抗锯齿的扩展比例 字体时使用。 在参数 pFont 指向使用 4 bpp 抗锯齿的扩展比例 字体时使用。 GUI_XBF_GET_DATA_FUNC – 描述 int GUI_XBF_GET_DATA_FUNC(U32 Off, U16 NumBytes, void * pVoid, void * pBuffer); 该函数应设置 pBuffer,指向请求数据所在的位置。例如,一个 “GetData”函数,请参见 “使用 ...Ex() 函数获取数据”(第 167 页)。 其他信息 参数 pfGetData 应指向负责从字体文件获取数据的应用定义的回调函数。在请求字体数据时,参数 pVoid 将传递给回调函数。例如,可使用它将文件句柄传递给回调函数。 该函数要求指向 GUI_FONT 结构和 GUI_XBF_DATA 结构。该函数将使用字体信息填充这些结构。这 些结构的内容在字体使用期间必须保持有效。该函数不知道必须要创建的 XBF 字体类型,因此必须使 用参数 pFontType 告知该函数要创建的字体类型。这样,可避免链接不必要的代码。 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 184 章节 字体 默认情况下,每个字符的数据字节最大值限制为 200。这应该满足大部分要求。如果加载使用更多字 节的字符,在调试版本中将生成警告。通过向文件 GUIConf.h 添加以下定义可增加默认值: #define GUI_MAX_XBF_BYTES 500 // Sets the maximum number of bytes/chars to 500 示例 static GUI_FONT Font; /* GUI_FONT structure in RAM */ static GUI_XBF_DATA XBF_Data; /* GUI_XBF_DATA structure in RAM */ static int _cbGetData(U32 Off, U16 NumBytes, void * pVoid, void * pBuffer) { /* The pVoid pointer may be used to get a file handle */ .../* TBD */ /* Set file pointer to the given position */ .../* TBD */ /* Read the required number of bytes into the given buffer */ .../* TBD */ } void CreateXBF_Font(void * pVoid) { GUI_XBF_CreateFont(&Font, /* Pointer to GUI_FONT structure */ &XBF_Data, /* Pointer to GUI_XBF_DATA structure */ GUI_XBF_TYPE_PROP, /* Font type to be created */ _cbGetData, /* Pointer to callback function */ pVoid); /* Pointer to be passed to callback */ } GUI_XBF_DeleteFont() 描述 删除参数 pFont 指示的 XBF 字体。 原型 void GUI_XBF_DeleteFont(GUI_FONT * pFont); 参数 pFont 指向要删除的字体。 描述 其他信息 使用 GUI_XBF_CreateFont() 创建的字体后,如果不再使用该字体,应将其删除。 9.12 常见字体相关的函数 GUI_GetFont() 描述 返回当前选择的字体的指针。 原型 const GUI_FONT * GUI_GetFont(void) GUI_GetCharDistX() 描述 返回用于显示当前所选字体中指定字符的宽度像素 (X 大小)。 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 185 原型 int GUI_GetCharDistX(U16 c); 参数 c 计算宽度所基于的字符。 描述 GUI_GetFontDistY() 描述 返回当前所选字体的 Y 间距。 原型 int GUI_GetFontDistY(void); 其他信息 Y 间距是两行相邻文本之间的垂直距离 (像素)。 返回的值是为当前所选字体输入的 YDist 值。 返回的值对比例字体和等宽字体都有效。 GUI_GetFontInfo() 描述 计算特定字体的 GUI_FONTINFO 结构的指针。 原型 void GUI_GetFontInfo(const GUI_FONT*pFont, GUI_FONTINFO* pfi); 参数 pFont pfi 指向该字体。 指向 GUI_FONTINFO 结构。 描述 其他信息 GUI_FONTINFO 结构的定义如下所示: typedef struct { U16 Flags; } GUI_FONTINFO; 元素变量标记可采用以下值: GUI_FONTINFO_FLAG_PROP GUI_FONTINFO_FLAG_MONO GUI_FONTINFO_FLAG_AA GUI_FONTINFO_FLAG_AA2 GUI_FONTINFO_FLAG_AA4 示例 获取 GUI_Font6x8 的信息。计算后,FontInfo.Flags 包含标记 GUI_FONTINFO_FLAG_MONO。 GUI_FONTINFO FontInfo; GUI_GetFontInfo(&GUI_Font6x8, &FontInfo); GUI_GetFontSizeY() 描述 返回当前所选字体的高度像素 (Y 大小)。 原型 int GUI_GetFontSizeY(void); emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 186 章节 字体 其他信息 返回的值是为当前所选字体输入的 YSize 值。此值小于或等于 GUI_GetFontDistY() 函数返回的 Y 间距。 返回的值对比例字体和等宽字体都有效。 GUI_GetLeadingBlankCols() 描述 返回当前所选字体中给定字符的前导空格像素列数。 原型 int GUI_GetLeadingBlankCols(U16 c); 参数 c 示例 要使用的字符。 描述 以上屏幕截图中显示的字符 “B”的结果应为 2。 GUI_GetStringDistX() 描述 返回用于显示当前所选字体中指定字符串的 X 大小。 原型 int GUI_GetStringDistX(const char GUI_FAR *s); 参数 s 指向该字符串。 描述 GUI_GetTextExtend() 描述 计算使用当前字体的给定字符串的大小。 原型 void GUI_GetTextExtend(GUI_RECT* pRect, const char* s, int Len); 参数 pRect s Len 指向存储结果的 GUI_RECT-structure。 指向该字符串。 字符串的字符数。 描述 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 187 GUI_GetTrailingBlankCols() 描述 返回当前所选字体中给定字符的后导空格像素列数。 原型 int GUI_GetTrailingBlankCols(U16 c); 参数 c 示例 要使用的字符。 描述 以上屏幕截图中显示的字符 “B”的结果应为 1。 GUI_GetYDistOfFont() 描述 返回特定字体的 Y 间距。 原型 int GUI_GetYDistOfFont(const GUI_FONT* pFont); 参数 pFont 指向该字体。 描述 其他信息 (见 GUI_GetFontDistY()) GUI_GetYSizeOfFont() 描述 返回特定字体的 Y 大小。 原型 int GUI_GetYSizeOfFont(const GUI_FONT* pFont); 参数 pFont 指向该字体。 其他信息 (见 GUI_GetFontSizeY()) 描述 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 188 章节 字体 GUI_IsInFont() 描述 评估特定字体中是否包含指定的字符。 原型 char GUI_IsInFont(const GUI_FONT * pFont, U16 c); 参数 pFont c 指向该字体。 要搜索的字符。 描述 其他信息 如果指针 pFont 设置为 0,则使用当前所选的字体。 示例 评估字体 GUI_FontD32 中是否包含 “X”。 if (GUI_IsInFont(&GUI_FontD32, 'X') == 0) { GUI_DispString("GUI_FontD32 does not contains 'X'"); } GUI_SetDefaultFont() 描述 设置 GUI_Init() 之后使用的默认字体。 原型 void GUI_SetDefaultFont(const GUI_FONT GUI_UNI_PTR * pFont); 参数 pFont 指向要使用的字体。 描述 9.13 字符集 9.13.1 ASCII emWin 支持完整的 ASCII 字符集。以下是从 32 到 127 的 96 种字符: 十六 进制 0 1 2 3 4 5 6 7 8 9 ABCD E F 2x ! "# $ % & '( ) * + , - . / 3x 0 1 2 3 4 5 6 7 8 9 : ; < = > ? 4x @ A B C D E F G H I J K L M N O 5x P Q R S T U V W X Y Z [ \ ] ^ _ 6x `a b c d e f g h i j k l m n o 7x p q r s t u V w x y z { | } ~ 遗憾的是,由于 ASCII 代表美国信息交换标准代码,所以它是针对美国需求而设计。它不包含欧洲语 言中使用的任何特殊字符,例如 Ä, Ö, Ü, á, à, 以及其他字符。这些 “欧洲扩展”的 ASCII 字符集 没有唯一的标准,而是存在多个不同的标准。互联网以及大多数 Windows 程序使用的标准是 ISO 8859-1,即 ASCII 字符集的超集。 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 189 9.13.2 ISO 8859-1 西方拉丁字符集 emWin 支持 ISO 8859-1,它定义了以下所列的字符: 代码 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 描述 不间断空格 倒置的感叹号 分符号 英镑 一般货币符号 日元符号 断开的竖线 章节符号 变元音 (分音符) 版权 阴性顺序 左角引号, guillemotleft 否定符号 软连字号 注册商标 长音符 角度符号 加号或减号 上标 2 上标 3 尖音符 微符号 段落符号 中间点 变音符 上标 1 masculine ordinal 右角引号, guillemot right 分数四分之一 分数二分之一 分数四分之三 倒置的问号 大写 A,重音符 大写 A,尖音符 大写 A,抑扬音符 大写 A,鼻音化符号 大写 A,分音符或变元音符号 大写 A,环形 大写 A,双元音 (连字) 大写 C,变音符 大写 E,重音符 大写 A,尖音符 大写 E,抑扬音符 大写 E,分音符或变元音符号 大写 I,重音符 大写 I,尖音符 大写 I,抑扬音符 大写 I,分音符或变元音符号 Eth,冰岛语 N,鼻音化符号 大写 O,重音符 大写 O,尖音符 大写 O,抑扬音符 大写 O,鼻音化符号 大写 O,分音符或变元音符号 乘号 emWin V5.12 用户参考手册 字符 ¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ ® ¯ ° ± ² ³ ´ μ ¶ · ¸ ¹ º » ¼ ½ ¾ ¿ À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö × © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 190 章节 字体 代码 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 描述 大写 O,斜线 大写 U,重音符 大写 U,尖重音符 大写 U,抑扬音符 大写 U,分音符或变元音符号 大写 Y,尖音符 THORN,冰岛语 急转的 s, 德语 (s-z 连字) 小写 a,重音符 小写 a,尖音符 小写 a,抑扬音符 小写 a,鼻音化符号 小写 a,分音符或变元音符号 小写 a,环形 小写 ae 双元音 (连字) 变音符 小写 e,重音符 小写 e,尖音符 小写 e,抑扬音符 小写 e,分音符或变元音符号 小写 i,重音符 小写 i,尖音符 小写 i,抑扬音符 小写 i,分音符或变元音符号 小写 eth,冰岛语 小写 n,鼻音化符号 小写 o,重音符 小写 o,尖音符 小写 o,抑扬音符 小写 o,鼻音化符号 小写 o,分音符或变元音符号 除号 小写 o,斜线 小写 u,重音符 小写 u,尖音符 小写 u,抑扬音符 小写 u,分音符或变元音符号 小写 y,尖音符 小写 thorn,冰岛语 小写 y,分音符或变元音符号 字符 Ø Ù Ú Û Ü Ý Þ ß à á â ã ä å æ ç è é ê ë ì í î ï ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ 9.13.3 Unicode Unicode 是最终的字符解码方法。它是基于 ASCII 和 ISO 8859-1 国际标准。与 ASCII 不同的是, UNICODE 要求 16 位字符,因为所有字符都拥有自己的代码。当前,定义了 30,000 多种不同的字 符。不过,并非所有字符图像在 emWin 中都进行了定义。用户可自行定义其他相关字符。请与 SEGGER Microcontroller GmbH & Co. KG 或您的经销商联系,我们可能已拥有您所需的字符集。 emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 191 9.14 字体转换器 emWin 可以使用的字体必须作为 C 中的 GUI_FONT 结构进行定义。这些结构或它们所引用的字体数 据可以相当大。手动生成这些字体非常耗时且效率低下。因此,我们建议使用字体转换器,它可以基 于字体自动生成 C 文件。 字体转换器属于简单的 Windows 程序。您只需将安装的 Windows 字体加载到该程序,根据需要对 其编辑,将其另存为 C 文件。然后,则可以编译 C 文件,允许在需求 emWin 的显示器中显示该字体。 默认情况下,字符代码 - 0x1F 和 0x80 - 0x9F 被禁用。以下是加载了字体的字体转换器的屏幕截 图示例: 字体转换器将在单独手册中介绍,通过 SEGGER Microcontroller GmbH & Co. KG () 可请求获 得该文档。 9.14.1 添加字体 创建字体文件并将其链接到项目后,作为外部常量 GUI_FONT 对链接的字体进行声明,如以下示例 所示: 示例 extern const GUI_FONT GUI_FontNew; int main(void) { GUI_Init(); GUI_Clear(); GUI_SetFont(&GUI_FontNew); GUI_DispString("Hello world\n"); return 0; } emWin V5.12 用户参考手册 © 1997 - 2011 SEGGER Microcontroller GmbH & Co. KG 192 章节 字体 9.15 标准字体 emWin 随附一系列字体,可满足您的大部分需求。标准字体包包含不同大小和样式的等宽字体和比 例字体。等宽字体指字符宽度固定的字体,其中所有字符的宽度像素相同。比例字体指其中每个字符 有自己单独的宽度像素的字体。 本章将概述标准的 emWin 字体。 9.15.1 字体标识符命名约定 所有标准字体的命名如下所示。然后,表中解释了命名约定的元素: GUI_Font[