当前位置:首页 >> 信息与通信 >>

C10H19 GFX Lab Manual


C10H19 GFX

使用Microchip图形库 进行设计
实验手册

1341 GFX2

硬件
硬件设置的特殊说明
为正确的Graphics PICTail版本进行硬件准备的步骤
在Graphics PICTail 2上运行代码时: 在当前动手实验材料的目录中,打开Gra

phicsConfig.h文件,找到下面的行:

GraphicsConfig.h
/********************************************************************* * Overview: * Graphics PICtail Plus Board Version setting. The value assigned * to this macro determines the version of the PICtail Plus Board. * - 2 - Uses Graphics PICtail Plus Board Version 2 * - 3 - Uses Graphics PICtail Plus Board Version 3 * ********************************************************************/ //#define GRAPHICS_PICTAIL_VERSION 2 // when using version 2 //#define GRAPHICS_PICTAIL_VERSION 3 // when using version 3

如果您使用的是Graphics PICTail Version 2,去掉Version 2的#define前面的注释符。 如果您使用的是Graphics PICTail Version 3,去掉Version 3的#define前面的注释符。 对于Version 3,确保跳线JP2设置成8位。 Graphics PICTail Version 2 Graphics PICTail Version 3

1341 GFX2

Microchip的名称和徽标组合、Microchip徽标、dsPIC、KEELOQ、KEELOQ徽标、MPLAB、PIC、PICmicro、PICSTART、rfPIC和 UNI/O均为 Microchip Technology Inc.在美国和其他国家或地区的注册商标。 FilterLab、Hampshire、HI-TECH C、Linear Active Thermistor、MXDEV、MXLAB、SEEVAL和The Embedded Control Solutions Company 均为Microchip Technology Inc.在美国的注册商标。 Analog-for-the-Digital Age、Application Maestro、CodeGuard、dsPICDEM、dsPICDEM.net、dsPICworks、dsSPEAK、ECAN、 ECONOMONITOR、FanSense、 HI-TIDE、In-Circuit Serial Programming、ICSP、Mindi、MiWi、MPASM、MPLAB Certified徽标、MPLIB、MPLINK、mTouch、Octopus、 Omniscient Code Generation、PICC、PICC-18、PICDEM、PICDEM.net、PICkit、PICtail、PIC32徽标、REAL ICE、rfLAB、Select Mode、 Total Endurance、TSHARC、UniWinDriver、WiperLock和ZENA均为Microchip Technology Inc.在美国和其他国家或地区的商标。 SQTP是Microchip Technology Inc.在美国的服务标记。 在此提及的所有其他商标均为各持有公司所有。

? 2009, Microchip Technology Inc.版权所有。 本出版物中所述的器件应用信息及其他类似内容仅为您提供便利,它们可能由更新之信息所替代。确保应用符合技术规范,是您自身应负的责 任。Microchip对这些信息不作任何明示或暗示、书面或口头、法定或其他形式的声明或担保,包括但不限于针对其使用情况、质量、性能、 适销性或特定用途的适用性的声明或担保。Microchip对因这些信息及使用这些信息而引起的后果不承担任何责任。如果将Microchip器件用于 生命维持和/或生命安全应用,一切风险由买方自负。买方同意在由此引发任何一切伤害、索赔、诉讼或费用时,会维护和保障Microchip免于 承担法律责任,并加以赔偿。在Microchip知识产权保护下,不得暗中或以其他方式转让任何许可证。

1341 GFX2

实验练习一
创建飞溅屏幕
实验目的
在这第一个实验中,您将为GUI创建一个飞溅屏幕(Splash Screen)。使用Bitmap and Font Converter (位图和 字体转换工具),生成要在本项目中使用的字体和位图。您将学习如何把生成的字体和位图文件集成到项目中去。您还 将学习使用库提供的一些基本绘图形状和属性。我们将使用Lab1项目中的Lab1.c文件。为了方便起见,在C:\RTC\HIF 2131\Lab1\Lab1 Solution\中给出了完整的解决方案。

需求
开发环境: 软件: C编译器: 硬件工具: MPLAB? v8.3x Microchip Graphics Library v1.75 Bitmap and Font Converter 用于PIC24及dsPIC器件的MPLAB? C编译器,或者 用于PIC32器件的MPLAB? C编译器 带PIC24FJ128GA010或PIC32MX360F512L PIM的Explorer 16 Graphics PICtail Plus子板,版本2.0或3.0 MPLAB? Real ICE或MPLAB? ICD3调试器 C:\RTC\HIF 2131\Lab1...

实验用电脑中的实验文件:

目标
1) 使用Bitmap and Font Converter,把位图和字体转换成图形库能够使用的结构。 2) 写程序,程序将使用经过转换的位图和字体以及各种基本形状,创建并显示如下所示的飞溅屏幕。 已提供触摸屏和擦除动画功能,从而在完成本实验后,您将能够通过触摸屏幕显示字符串“Ready for Lab 2?”。

徽标位图文件(mchpLogo.bmp) 文本串,使用的是DoulosSILR true type字体 绘图,使用的是原语层函数

1-1

1341 GFX2

步骤
如果前一个项目还是打开的,首先必须关闭它,方法是从菜单中选择: File ? Close Workspace 然后,打开Lab1,方法是从菜单中选择: File ? Open Workspace… 并且打开与开发板设置对应的工作区文件,文件位置是: C:\RTC\HIF 2131\Lab1 选择: Lab1 PIC24.mcw,如果是带PIC24FJ128GA010 PIM的Explorer 16 Lab1 PIC32.mcw,如果是带PIC32MX360F512L PIM的Explorer 16 为了验证设置,编译项目并对处理器进行编程。 Program Build All

Debug / Release

选择Release模式。

点击Build All按钮。

如果没有报告错误, 点击Program按钮。 从菜单中选择编程器: Programmer ? Select Programmer ? MPLAB? ICD 3 或者 REAL ICE

一些图形板可能要求触摸屏校准。 请按照LCD面板上的指示,完成校 准步骤,以便确保在实验过程中正 确操作。如果有必要,可以手动进 入校准模式,方法是在按下或释放 MCLR时按住开关S3。

1-2

1341 GFX2
如果设置正确,将看到此屏幕。触摸屏幕将启动一段擦除动画,并以一句特殊的短语作为结束。

您在屏幕上看到的是一个16 bpp的位 图,位图以160 x 120像素格式存 储。要全屏显示图形,我们可在 PutImage API中加上IMAGE_X2伸缩 因子。

开始时,将用Microchip徽标替代上面显示图像的硅沙漠部分。为此,首先必须使用位图及字体转换工具 把徽标位图文件转换为可用格式。启动转换工具,方法是: 开始 ? 程序 ? Microchip ? Graphics Library v1.65 ? Bitmap and Font converter

位图文件路径: C:\RTC\HIF 2131\Bitmaps mchpLogo.bmp
4 6

6 3

5

在工具中点击Add Images,载入位图文件mchpLogo.bmp。 查看图像大小是否为202x100像素,色深是否为4 bpp。验证Label显示为mchpLogo。 对于PIC24,设置成C30 Build。 对于PIC32,设置成C32 Build。 点击Convert。

如果为项目选择了错误的编译(build) 选 项,稍后将出现编译错误。

选择保存文件类型为“Array in Internal Flash.c” 把转换后的文件保存为:C:\RTC\HIF 2131\Lab1\NewIntro.c 不要关闭转换工具,在下一步骤我们还将使用它。
1-3

1341 GFX2
高亮显示mchpLogo并点击Remove。现在我们将转换打算用在此项目中的字体。 在转换工具中点击Add Fonts,找到文件DoulosSILR.ttf。

字体源路径: C:\RTC\HIF2131\Fonts DoulosSILR.ttf
9

11 7

如果不删除位图图像的话,图像和字体都 将出现在转换后的文件中。那没什么;但 是,如果在本实验中按步骤进行的话, 在 步骤19将出现编译错误,因为在结束时将 有两个图像结构体。 在Set Font Style窗口中,选择:

10

1. 2. 3. 4. 5.

Size设置成12 Weight设置成NORMAL Range设置成(32-127) Script设置成Western 点击OK。

通过限制字符范围,可以限制字体 结构体的大小。例如,如果将只使 用小写字母,把范围更改为97122。

双击Label字段,把DoulosSILR字体重命名为MyNewFont。

9

对于PIC24,设置成C30 Build。 对于PIC32,设置成C32 Build。 点击Convert。

如果为项目选择了错误的编译 选项,稍后 将出现编译错误。

选择保存文件类型为“Array in Internal Flash.c” 把转换后的文件保存为:C:\RTC\HIF 2131\Lab1\NewFont.c
点击Quit,退出Bitmap and Font Converter工具。 1-4

1341 GFX2
我们的图像和位图源文件都已经成功转换。下一步是向Lab1项目中添加转换后的文件。在MPLAB?项目 窗口中,右击源文件,然后从下拉菜单中选择Add Files...,把文件添加到项目中去。另一种方法是从菜单 栏中选择Project ? Add Files to Project ...。

从菜单中选择Project ? Add New File to Project ... 事实上将删除 所选文件。如果出现了这样的情况,请告诉实验辅导人员,我们将 对库文件进行恢复。 从Lab1目录中,选择NewFont.c和NewIntro.c,然后点击open。

由于我们不再需要Pictures.c(或Pictures32.c)文件,请把它从项目中删除。为此,高亮显 示文件,然后点击选择“Remove File”。另一种方法是在文件高亮显示之后,按下删除 键。如果使用的是PIC24,不删除此文件将导致链接错误,告知您需要大代码模型。
1-5

1341 GFX2 参考信息
下列颜色名在驱动程序头文件中已经进行了定义: BLACK BRIGHTMAGENTA GREEN BROWN LIGHTGREEN YELLOW GRAY2 BRIGHTBLUE BRIGHTRED CYAN LIGHTGRAY LIGHTCYAN WHITE GRAY3 BRIGHTGREEN BRIGHTYELLOW RED DARKGRAY LIGTHRED GRAY0 GRAY4 BRIGHTCYAN BLUE MAGENTA LIGHTBLUE LIGHTMAGENTA GRAY1 GRAY5

使用RGB565Convert(R,G,B)宏。您将需要提供红、绿和蓝颜色浓度的值,颜色浓度是一个8位 整数值,255表示最大浓度。例如: #define ORANGE RGB565Convert(255, 127, 0) 将创建名为ORANGE的颜色。 现在我们将准备开始编写程序。为方便起见,按照下面步骤的说明对实验一代码进行简单的修改。首先, 我们声明字体和位图的结构体。 在89行,把图像名更改为mchpLogo extern const BITMAP_FLASH intro; //### <--- Change image name here ### 15

在100行,添加声明语句,把MyNewFont声明为外部FONT_FLASH类型。 //########################################################################### // ### Your Code Here ### //## <--- Declare MyNewFont here ### // Default GOL font. extern const FONT_FLASH GOLFontDefault; 16

在141行,找到StartScreen()函数。在此函数中,我们将编写必要的代码以便显示新的飞溅屏幕。在这个 过程中,将要编译和编程好几次。 从152行开始,插入代码,把屏幕背景色设置为白色。注意,值WHITE是在LCD驱动程序头文件中预定义 的颜色。

步骤17参考信息
SetColor宏 — 设置当前绘图颜色 #define SetColor(color) ClearDevice函数 — 使用当前绘图颜色清除屏幕 void ClearDevice(void);

1-6

1341 GFX2
从166行开始,更改代码,把引导图像替换为mchpLogo图像。 a. 注释掉对PutImage(…) API的调用。 b. 插入代码,计算新图像的x坐标,使得徽标图像显示在屏幕水平方向的中央。提示:(X最大值 - 图像 宽度)/ 2将给出水平方向的中心点。把计算结果存放在x_image变量中。 c. 插入代码,在屏幕位置x_image, 10(即,top = 10)处,使用NORMAL拉伸因子,显示图像。提示: 使用PutImage(…) API以及名为mchpLogo的图像。

步骤18参考信息
GetMaxX() 宏 — 返回水平方向上屏幕的最大值 #define GetMaxX() GetImageWidth函数 — 返回图像宽度 SHORT GetImageWidth( void* bitmap ); PutImage 函数 — 显示图像,图像起始坐标是图像左上角的坐标 void PutImage( SHORT left, SHORT top, void* bitmap, BYTE stretch);

编译项目并对器件进行编程。验证图像是否显示在预期的位置上。 Build All Program

如果一切顺利,你将在屏幕上看到下面的图像。

19

1-7

1341 GFX2
从187行开始,插入显示预定义字符串所需的代码,预定义字符串存放在 text[]中。 字符串应该是 BRIGHTRED色,使用MyNewFont,且位于水平方向中央,而y=110。 a. 把当前颜色设置为BRIGHTRED(它是预定义的颜色值)。 b. 把字体图像设置成MyNewFont。 c. 插入代码,计算字符串的x坐标,坐标要使串显示在屏幕水平方向的中央。 提示:(X最大值 - 串宽度) / 2将给出水平方向的中心点。把计算结果存放在x_text变量中。 d. 插入代码,使用坐标x_text, 110,在屏幕上显示text[]。提示:OutTextXY(…)

步骤21参考信息
SetColor宏 — 设置当前绘图颜色 #define SetColor(color) SetFont函数 — 设置用在OutTextXY()、OutText()和OutChar() 函数中的当前字体 void SetFont( void* font); GetMaxX()宏 — 返回水平方向上屏幕的最大值 #define GetMaxX() (SCREEN_HOR_SIZE—1) GetTextWidth函数 — 返回指定字符串(它使用指定的字体)的宽度 SHORT GetTextWidth( XCHAR* textstring, void* font); OutTextXY函数 — 以给定的x,y位置为起点,显示以null结尾的字符串 WORD OutTextXY( SHORT x, SHORT y, XCHAR* textstring); 该函数使用当前激活的字 体。 对于非阻塞式配置,如果显示正忙的话,OutTextXY()可能 会将控制返回给程序。当这种情况出现时,将返回0,必须再 次调用OutTextXY(...),继续输出字符串。对于阻塞式配置, 此函数始终返回“1”。 Program

编译项目,并对器件进行编程。 验证图像和字符串是否显示在预期的位置上。

Make

如果一切顺利,您将在屏幕上看到这个。 21

1-8

1341 GFX2
最后的任务是使用原语API,在屏幕底部绘制两个图形。其他形状已经预先编写好了代码,供您参考。 在Lab1.c中从203行开始,插入代码,显示用BRIGHTGREEN颜色填色的方框,方框位置是:left = 44, top = 155, right = 88, bottom = 199。注:BRIGHTGREEN是已定义过的颜色。 在Lab1.c中从213行开始,插入代码,显示BRIGHTYELLOW色的空心圆,圆的位置是:x = 241, y = 177,且radius = 22 。注: BRIGHTYELLOW是已定义过的颜色。

步骤22-23参考信息
SetColor宏 — 设置当前绘图颜色 #define SetColor(color) _color = color //颜色以 5:6:5 RGB 格式编码 Bar函数 — 给定left、top、right和bottom顶点,使用当前颜色,绘制条形 void Bar( SHORT left, SHORT top, SHORT right, SHORT bottom); Circle宏 — 给定圆心和半径,使用当前颜色,绘制圆形 #define Circle( x, y, radius ) Bevel( x, y, x, y, radius) 在Lab1.c的222行,关闭编译器开关可显示其他形状。 编译项目并对器件进行编程。 验证飞溅屏幕是否与1-1页上显示的预期结果相匹配。 Make Program

触摸屏幕。 显示的短语改变了吗?如果改变,说明您已经完成了实验一。干得好!

25

1-9

1341 GFX2

结果
您刚才已经学习了如何把图像和字体集成到使用图形库的应用中去。您还学习了如何实现原语绘制函数以 及如何控制全局绘制属性(诸如使用的颜色、线型和字体等)。如果提前完成实验,可以尝试其他各种原 语函数,它们可以在图形库帮助文件中找到。

代码分析
您进行过修改的简单应用程序实现了一个触摸屏模块,并使用原语绘制函数绘制了一个简单的飞溅屏幕。 每一原语函数都要受到全局绘制属性(诸如线型、线的大小和颜色等)的影响。对于文本,字体和当前颜 色设定影响着屏幕上文本显示的方式。

小结
在学习了如何使用图形库的原语层之后,您已经做好了进一步学习的准备,以了解实现控件的图形对象 层。您离把应用与图形解决方案完全集成在一起这个目标又近了一步。接下来的实验将介绍图形对象层, 以及使用图形库提供的控件。由于图形对象层中的控件将调用原语层函数,您现在已经弹药充足,可以创 建自己的控件了。关于这一主题的应用笔记很快将发布。

1-10

1341 GFX2

实验练习二
创建菜单屏幕
实验目的
既然已经完成了飞溅屏幕,我们将为应用创建一个简单的菜单。在本实验中您将绘制两个按钮以及两个静态文本控件。本 实验的重点在于了解控件的创建和绘制API。正因为如此,触摸屏和侧按钮输入已经被禁用。后续的实验将探究如何集成 用户和系统输入。为了方便起见,在C:\RTC\HIF 2131\Lab2\Lab2 Solution\中给出了完整的解决方案。

需求
开发环境: 软件: C编译器: 硬件工具: MPLAB? v8.30 Microchip Graphics Library v1.75 用于PIC24及dsPIC器件的MPLAB? C编译器v3.10,或者 用于PIC32器件的MPLAB? C编译器 带PIC24FJ128GA010 或者 PIC32MX360F512L PIM的Explorer 16 Graphics PICtail Plus子板,版本2.0或3.0 MPLAB? Real ICE或MPLAB? ICD3调试器 C:\RTC\HIF 2131\Lab2...

实验用电脑中的实验文件:

目标
? ?
使用GOLCreateScheme() API,创建2个颜色方案。 使用相应的ObjCreate(…) API,创建:

? ? ?

2个正方形按钮。一个有文本,一个有图像(无文本)。 2个静态文本,用来标记按钮。

使用GOLDraw() API,生成要显示的控件。

预期结果

文本居中的正方形按钮 有边框的静态文本 有位图图像的矩形按钮

2-1

1341 GFX2

步骤
如果前一个项目还是打开的,首先必须关闭它,方法是从菜单中选择: File ? Close Workspace 然后,打开实验二,方法是从菜单中选择: File ? Open Workspace… 并且打开与您的开发板设置对应的工作区文件,文件位置是: C:\RTC\HIF 2131\Lab 2 选择: Lab2 PIC24.mcw,如果是带PIC24FJ128GA010 PIM的Explorer 16 Lab2 PIC32.mcw,如果是带PIC32MX360F512L PIM的Explorer 16 下列颜色在驱动程序头文件(LGDP4531.h)中已经进行了定义: BLACK BRIGHTMAGENTA GREEN BROWN LIGHTGREEN YELLOW BRIGHTBLUE BRIGHTRED CYAN LIGHTGRAY LIGHTCYAN WHITE BRIGHTGREEN BRIGHTYELLOW RED DARKGRAY LIGTHRED SADDLEBROWN BRIGHTCYAN BLUE MAGENTA LIGHTBLUE LIGHTMAGENTA SIENNA

如果打算添加自己的颜色,可以使用RGB565Convert( 供红、绿和蓝的值。例如: #define ORANGE RGB565Convert(255, 127, 0) 将创建颜色 ORANGE。

)宏进行添加。您将需要依照顺序提

要在应用中使用控件,必须把控件的源文件和头文件添加到项目中去。在项目窗口中,把下列源文件添加 到项目中:GOL.c、Button.c以及StaticText.c

库文件源目录: C:\Microchip Solutions\Microchip\Graphics
把下列头文件添加到项目中去:GOL.h、Button.h以及StaticText.h

库文件包含目录: C:\Microchip Solutions\Microchip\Include\Graphics
警告!从菜单中选择Project ? Add New File to Project ... 事实上 将删除所选文件。如果出现了这样的情况,请告诉实验辅导人员, 我们将对库文件进行恢复。

2-2

1341 GFX2
另外,我们还必须在GraphicsConfig.h头文件中使能打算使用的控件。为此,打开文件,去掉按钮和静态 文本编译器开关前面的注释符。

GraphicsConfig.h
197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 //#################################################################### //Lab 2: Step 4 //Enable the widgets you are using by uncommenting the appropriate //compiler switch below. //#################################################################### #define USE_GOL // Add for v1.52 of the library #define USE_BUTTON // Enable Button Object. //#define USE_WINDOW // Enable Window Object. //#define USE_CHECKBOX // Enable Checkbox Object. //#define USE_RADIOBUTTON // Enable Radio Button Object. //#define USE_EDITBOX // Enable Edit Box Object. //#define USE_LISTBOX // Enable List Box Object. //#define USE_SLIDER // Enable Slider or Scroll Bar Object. //#define USE_PROGRESSBAR // Enable Progress Bar Object. #define USE_STATICTEXT // Enable Static Text Object. //#define USE_PICTURE // Enable Picture Object. //#define USE_GROUPBOX // Enable Group Box Object. //#define USE_ROUNDDIAL // Enable Dial Object. //#define USE_METER // Enable Meter Object. //#define USE_GRID // Enable Grid Object. //#define USE_CHART // Enable Chart Object //#define USE_CUSTOM // Enable Custom Control Object

既然已经恰当设置了用在我们应用中的控件,我们需要创建控件将使用的风格方案。两个按钮将使用库的 默认风格方案,默认风格方案定义在GOL.h中。两个静态文本将使用稍许不同的风格方案。 在位于Lab2.c的main()函数中,在108行,添加代码,初始化显示,初始化库,创建默认风格方案。提 示:GOLInit() API将完成所有这些任务;所以只需要一行代码。 风格方案(Style Scheme)——是为库所使用的结构体,用来定义绘制控件时使用的颜色和 字体。创建控件时使用赋值为NULL的风格方案,则将把默认风格方案幅值给对象。 typedef struct { WORD EmbossDkColor; WORD EmbossLtColor; WORD TextColor0; WORD TextColor1; WORD Color0; WORD Color1; WORD ColorDisabled; WORD CommonBkColor; void *pFont; } GOL_SCHEME;

// 浮雕暗色,用于3d效果 // 浮雕亮色,用于3d效果 // 字符颜色0,用于支持文本的对象 // 字符颜色1,用于支持文本的对象 // 颜色0通常分配给某个对象状态 // 颜色1通常分配给某个对象状态 // 当对象处于禁用状态时使用的颜色 // 用来隐藏对象的背景色 // 方案选用的字体

WORD TextColorDisabled; // 当对象处于禁用状态时使用的字符颜色

2-3

1341 GFX2
由于静态文本控件使用的是修改后的风格方案,我们将需要添加定义风格方案的代码。注:本节中不用改 动方案的颜色。这一步将在稍后进行。 在位于Lab2.c的main()函数中,在122行添加代码,把替代的风格方案赋值给menuScheme指针。注: 指针已经定义过了。

步骤5、6参考信息
GOLInit()函数 — 初始化显示和库,然后使用默认设置创建默认风格方案,它被全局方案指针所引 用。在可以使用图形对象层(GOL)函数之前,必须调用此函数。 void GOLInit(void); GOLCreateScheme()函数 — 创建新的风格方案结构体,其参数初始化为定义在GOL.h的默认值。返 回指向新结构体的GOL_SCHEME指针。 GOL_SCHEME *GOLCreateScheme(void); 由于我们在main()函数中,并且知道将需要生成一些要显示的东西,在应用程序的while循环中(136行) 添加一行代码,在屏幕上生成控件。

步骤7参考信息
GOLDraw()函数 — 循环遍历活动链表,重绘需要重绘的控件。部分或全部重绘由控件结构体中的状态 域决定。全部控件绘制完成时返回TRUE。 WORD GOLDraw(void);

定义了风格方案之后,我们现在要准备开始创建控件。创建将分两步进行。首先将创建按钮并验证按钮在 显视屏上的外观。然后,我们将添加静态文本,对按钮进行标注。 在Lab2.c的141行,找到CreateMenuScreen()函数。从163行开始,添加代码,使用下面给定的参数,创 建两个正方形按钮(提示:两次调用BtnCreate()函数)。为了方便起见,下面给定的值都是预定义的宏, 可在GFXLab.h中找到。注:按钮1使用文本,而按钮2使用位图。至于BtnCreate() API函数原型,请参阅 图形库帮助文件。 ? ? ? ? ? ? ? ? ? ? ID = ID_BTN1 left = BTN1LEFT top = BTN1TOP right = BTN1RIGHT bottom = BTN1BOTTOM radius = 0 state = BTN_DRAW *pBitmap = NULL *pText = “Cook” *pScheme = NULL ? ? ? ? ? ? ? ? ? ? ID = ID_BTN2 left = BTN2LEFT top = BTN2TOP right = BTN2RIGHT bottom = BTN2BOTTOM radius = 0 state = BTN_DRAW *pBitmap= &DateAndTime *pText = NULL *pScheme = NULL

按钮1参数

按钮2参数

2-4

1341 GFX2
编译项目并对器件进行编程。验证按钮是否在预期的位置上,且使用的是正确的风格方案。 Build All Program

如果忘记在GraphicsConfig.h文件 中启用控件,编译器将给出 BTN_DRAW相关错误。
9

如果忘记添加控件的源和头文 件,将出现链接错误。

既然按钮已经正确定义和定位,让我们添加两个静态文本来标注按钮。静态文本将需要有黑色背景下的白 色文本。回想一下,在步骤6中,我们添加了通过调用GOLCreateScheme()创建替代风格方案结构体的 代码。此外,我们还给该结构体赋值了一个指针*menuScheme。由于没有进行改动,*menuScheme使用 默认颜色值进行填充。 参考下图,在205行中添加代码,使得我们的静态文本拥有WHITE文本、BLACK背景和CYAN外框。 提示:要修改*menuScheme指向的结构体,使用menuScheme -> EmbossDkColor = BLUE;

2-5

1341 GFX2
为了创建静态文本,我们将调用StCreate()函数两次。从Lab2.c的221行开始,添加代码,使用下面给定 的参数,创建两个静态文本实例。为了方便起见,下面给定的值都是预定义的宏,可在GFXLab.h中找 到。至于StCreate() API函数原型,请参阅图形库帮助文件。 静态文本1参数 ? ? ? ? ? ? ? ? ID = ID_STXT1 left = STXT1LEFT top = STXT1TOP right = STXT1RIGHT bottom = STXT1BOTTOM state = ST_DRAW *pText = “Cook /nOption” *pScheme = menuScheme 静态文本2参数

? ? ? ? ? ? ? ?

ID = ID_STXT2 left = STXT2LEFT top = STXT2TOP right = STXT2RIGHT bottom = STXT2BOTTOM state = ST_DRAW *pText= “Set Time & /n Date Option” *pScheme = menuScheme

编译项目并对器件进行编程。验证静态文本是否在预期的位置上,且使用的是正确的风格方案。 Build All Program

12

如果忘记在GraphicsConfig.h文件 中启用控件,编译器将给出 ST_DRAW相关错误。

如果忘记添加控件源和头文件, 将出现链接错误。

现在我们需要改变文本对齐方式并启用边框。为此,我们将使用一些可用于静态文本控件的状态设置。在 本实验中当你创建控件时,通过将DRAW位设置为BTN_DRAW和ST_DRAW,使得控件能够被绘制。为 了添加边框并改变文本对齐方式,我们将修改ST_FRAME和ST_CENTER_ALIGN状态位。 在263行,添加代码,形成一个叫做state的变量,如下例所示: state = ST_FRAME | ST_CENTER_ALIGN; 控件的动作和外观通过其状态域进行定义。我们可以在创 建之后使用SetState()宏对状态进行修改。状态位按位执行 逻辑或(OR),从而改变某一位将不会影响其他位。用于 状态位的宏定义在控件头文件中。在图形库帮助文件中可 以找到更多信息。 2-6

1341 GFX2
在266和270行,使用前一步定义的状态变量,启用ID_STXT1和ID_STXT2 控件的状态位。例如,这样的 代码: state = BTN_TEXTBOTTOM | BTN_TOGGLE; SetState(GOLFindObject(BTN1), state); 将把BTN1控件的状态位设置为BTN_TEXTBOTTOM和BTN_TOGGLE。

步骤14参考信息
GOLFindObject()函数 — 使用给定的对象ID,找到活动链表中的控件,返回指向该控件的指针。 OBJ_HEADER* GOLFindObject(WORD ID); SetState()宏 — 设置给定对象的指定状态位。必须重绘对象,显示改变。使用此宏可同时设置若干状 态位。 #define SetState(pObj, stateBits) GOLSetScheme()宏 — 设置用于指定控件的风格方案。 #define GOLSetScheme(pObj, pScheme) 编译项目并对器件进行编程。验证屏幕是否与如下所示的菜单屏幕预期结果相匹配。 Build All Program

15

额外的步骤
玩乐时间!使用GOLSetScheme()函数,把menuScheme风格赋值给ID_BTN1。把TextColor0和Color0的 颜色更改为另外的颜色(参见2-2页上的表格)。按钮有什么变化?你的改动影响静态文本了吗?为什么 或者为什么不?使用RGB565Convert(R,G,B)宏,尝试定义自己的颜色。

2-7

1341 GFX2

结果
刚才已经学习了如何使用图形库中的控件。你已经知道多个对象及一个单独的函数调用是如何管理屏幕上 对象的生成的。你还学习了如何使用控件状态位启用控件的可用特性。你还学习了如何修改赋值给对象的 风格方案,从而改变对象在重绘时的外观。

代码分析
修改后的代码创建了四个独立的对象,代码使用GOLDraw(),把对象的生成管理交给库函数去完成。使用 状态位,你可以修改对象生成的方式。另外,使用风格方案,您可以轻松地修改颜色值或字体,从而改变 对象所使用的风格方案。

小结
在了解了如何使用图形库中的对象之后,您已经做好了进一步学习的准备,将学习如何根据用户输入(诸 如触摸屏)对对象行为进行修改。

2-8

1341 GFX2

实验练习三
与用户接口
实验目的
通过为我们的家电接口应用实现烹饪屏幕,学习实现简单的用户接口。在实验的第一部分,您将学习如何填充侧 按钮的消息结构体。在实验的第二部分,您将学习在响应来自侧按钮和触摸屏接口的用户输入时,如何提供系统 和控件控制。

需求
开发环境: 软件: C编译器: 硬件工具: MPLAB? v8.30 Microchip Graphics Library v1.75 Bitmap and Font Converter 用于PIC24及dsPIC器件的MPLAB? C编译器,或者 用于PIC32器件的MPLAB? C编译器 带PIC24FJ128GA010或PIC32MX360F512L PIM的Explorer 16 Graphics PICtail Plus子板,版本2.0或3.0 MPLAB? Real ICE或MPLAB? ICD3调试器 C:\RTC\HIF 2131\Lab3...

试验用电脑上的实验文件:

目标
1) 为特定用户事件填充消息结构体。 2) 在响应按下侧按钮或触摸触摸屏面板上按钮时,实现并观察按钮的默认行为。 3) 通过GOLMsgCallback() 函数,为系统和控件提供定制控制。

预期结果
按下UP或S3,将增加编辑框中的 分钟/秒钟数 按下DOWN或S6,将减少编辑框 中的分钟/秒钟数 按下Start或S4,将把显示改变为 右图所示 按下Cancel或S5,将使显示回到
S3—S6指的是位于Exploer 16板底部边沿的侧按钮。 它们依次为:S3 S6 S5 S4

3-1

1341 GFX2

步骤
如果前一个项目还是打开的,首先必须关闭它,方法是从菜单中选择: File ? Close Workspace 然后,打开实验三的工作区,方法是从菜单中选择: File ? Open Workspace…并且打开与您的开发板设置对应的工作区文件,文件位置是: C:\RTC\HIF 2131\Lab 3 选择: Lab3 PIC24.mcw,如果是带PIC24FJ128GA010 PIM的Explorer 16 Lab3 PIC32.mcw,如果是带PIC32MX360F512L PIM的Explorer 16 首先我们将填充侧按钮的消息。 打开文件 SideButton.c。说明开始于文件第70行的 注释部分。从88行开始,添加填充S6结构体 所需的代码。注意,经由Obj_ID域,开关与 特定的控件捆绑在了一起,从而按下 Explorer 16 板上的开关S6,其效果将等同 于按下触摸面板上的DOWN按钮。 S6的消息结构体设置 ? ? ? ? type = TYPE_KEYBOARD uiEvent = EVENT_KEYSCAN param1 = ID_DOWN_BTN param2 = SCAN_CR_PRESSED or SCAN_CR_RELEASED

步骤1:参考信息
使用消息结构体,以规定的格式把事件信息传递给库的消息管理器(即GOLMsg()函数)。 侧 按钮输入结构体的格式是: typedef struct { BYTE type, BYTE SHORT

// 侧按钮的输入类型 TYPE_KEYBOARD

uiEvent, // EVENT_KEYSCAN 或 EVENT KEYCODE param1, // 接收消息的控件的 ID(例如 ID_BTN1)

SHORT param2 // 扫描码或字符码,取决于 uiEvent } GOL_SCHEME; 如果您打算使用键盘或侧按钮类输入用户接口的话,应用笔记AN1227“Using with the Microchip Graphics Library”是很有价值的参考文献。 既然已经填充好消息结构体,我们将在 主应用程序循环中键入代码,调用图形 库的消息管理器。打开Lab3.c文件。说 明开始于130行的注释部分。在142和 148行,键入代码,恰当地调用库的消息 管理器。 a Keyboard

步骤2:参考信息
GOLMsg()函数 — 接收消息,循环遍历活动链表, 找出受到消息影响的控件。转换消息,然后调用 GOLMsgCallback()。 void GOLMsg(GOL_MSG *pMsg); 其中*pMsg是指向消息结构体的指针

3-2

1341 GFX2
编译项目,并对处理器进行编程,如下所示。按下开关,观察控件的行为。现在按下触摸面板上的按钮。 应该能看到相同的效果。 Build All Program

GetObjID(pObj)

步骤3 - 12:参考信息 GOLMsgCallback()流程图

yes
== ID_EXIT_BTN

no yes
== ID_START_BTN objMsg == BTN_PRESSED?

yes Change status box text
Add progress bar over EXIT button Disable EXIT button Set CookEnable flag

Change button text

no

no
Change button text Change status box text Add EXIT button over progress bar Enable EXIT button Clear CookEnable flag

yes
== ID_UP_BTN

objMsg == BTN_PRESSED?

yes

Increment time count Redraw edit boxes

no yes
== ID_DOWN_BTN

no yes

objMsg == BTN_PRESSED?

Decrement time count Redraw edit boxes

no
Default: Return 1

no

3-3

1341 GFX2 步骤3-12:参考信息
下表定义了用来实现烹饪屏幕的控件。指针已经在GOLMsgCallback()函数的xxx行上进行了定义。
控件 静态文本 编辑框(左) 编辑框(右) 按钮(UP) 按钮(DOWN) 按钮(START) 按钮(EXIT) 说明 显示烹饪状态 显示分钟 显示秒钟 增加时间值 减少时间值 开始烹饪过程(翻转开关) 返回主菜单 对象ID ID_STATUS ID_EDITBOX1 ID_EDITBOX2 ID_UP_BTN ID_DOWN_BTN ID_START_BTN ID_EXIT_BTN pRetBtn 定义的指针 pSt

控件默认行为的相关信息位于图形库帮助文件中,在ObjMsgDefault函数说明之下。默认情况 下,对于接收消息的控件而言,相应的绘制位将被置1。注:默认情况下,并不是所有的控件 都将接收消息。例如,静态文本不接收消息;但是,通过向GOLMsgCallback()中添加代 码,我们可以控制控件。

对于本应用而言,当用户按下开关或触摸屏幕上的按钮时,我们希望在系统中以及在屏幕上会发生某些事 情。 为了 实现 非默 认的 行 为, 我们 将开 始向 G OLMs gCallba ck() 函数 中添 加代 码。 如 果 关 闭 了 Lab 3.c,请再次打开它。GOLMsgCallback()起始于176行。函数的内容已经被注释掉了,所以我们 可以查看前一步骤中按钮的默认动作。删去184行和315行中的注释符。在189行,留意GetObjID()的使 用。由于作为输入参数,我们接收的是一个指向对象的指针,使用此函数来找到控件的ID。 GOLMsgCallback()函数是用户定义的函数,在传递的消息经过转换之后,被图形库的消息 管理器(GOLMsg())调用。在此函数中,根据接收到的消息,程序员可以增加或修改控件的 默认行为。 WORD GOLMsgCallback (WORD objMsg, OBJ_HEADER* pObj, GOL_MSG* pMsg); 输入: objMsg — 经过转换的消息 *pObj — 指针,指向受到事件影响的控件 pMsg — 指针,指向消息结构体 返回值: 1 — 消息管理器已经完成控件的默认动作 0 — 忽略默认动作 3-4

1341 GFX2
静态文本 编辑框 在位于Lab3.c的函数 CreateCookScreen() 中, 已 经创 建 好了 全部 控件。

按钮

START是个转换按钮

静态文本 编辑框 按下START按钮将不会 开始 倒 计时 。 该功 能将 在下一个实验中实现。

按钮

如上所示,在第一次按下START按钮时,我们必须更改静态文本和START按钮上的字符串。我们还必须 用进度条替代EXIT按钮。您可能已经注意到,在步骤3中,更改按钮或屏幕其他任何位置上的文本,并不 是按钮控件默认动作的一部分。为了实现此功能,我们将向GOLMsgCallback()函数中switch语句处添 加代码。步骤5-8的说明起始于199行的注释。 在216行,添加代码,把START按钮上的字符串更改为CANCEL。注意:是在ID_START_BTN的case语 句处进行添加。还要注意,在此case语句内,指向START按钮的指针是pObj,因为这是GOLMsg()传递给 回调函数的指针。由于我们将从回调函数中返回 1,默认动作将会出现。其结果就是 START按钮的 BTN_DRAW位将被置1;因此,没有必要调用SetState()函数。 在221和223行,添加代码,把静态文本的字符串更改为“COOKING”。将需要两行代码。注:静态文本 没有任何默认动作;因此不需要置位ST_DRAW状态位。

步骤5-6:参考信息
BtnSetText()函数 — 对于被引用的按钮,设置要显示在其上的字符串。 void BtnSetText( BUTTON* pB, XCHAR* text); StSetText()函数 — 对于被引用的静态文本,设置要显示在其上的字符串。 void BtnSetText( BUTTON* pB, XCHAR* text); SetState()宏 — 对于给定对象,置位指定的状态位。必须重绘对象,显示变动。使用此宏可 同时置位若干个状态位。 #define SetState(pObj, stateBits) 3-5

1341 GFX2
从228行开始,添加代码,用进度条替换EXIT按钮。为了完成这一任务,我们将简单地在EXIT按钮表面绘 制(或覆盖)进度条,然后禁用EXIT按钮。注:我们不使用此代码来递减进度条,仅仅是在响应按钮按下 时绘制进度条。进度条动作将在下一实验中实现。注:进度条控件没有默认动作;因此,不需要置位 PB_DRAW状态位。

步骤7:参考信息
ClrState()宏 — 对于给定对象,清零指定的状态位。必须重绘对象,显示变动。使用此宏可同时 清零若干个状态位。 #define ClrState(pObj, stateBits) PbSetRange()函数 — 把进度条范围设置为最大值,最大值由range变量给出。对于我们的实 验,最大值由timeValue变量定义。 void PbSetRange( PROGRESSBAR* pPb, WORD range); 在244行,提供系统输出,响应START按钮的按下,输出是点亮一个或多个LED。作为本实验代码的一部 分,提供了一个函数供您使用。调用SetLED(state, whichOne),其中state = LED_ON或LED_OFF 且whichOne是一个word变量,其相应的LED位置位(D3 = bit 0, D4 = bit 1, … D9 = bit 7)。

步骤8:参考信息
在Explorer 16上,八个LED(D3-D10)被连接到处理器的PORTA。为了使用LED,必须安装跳 线JP2。LED D10是与S5开关共用的;所以将不会用在我们的应用中。位于Lab3.c中的函数 InitLED()将为您初始化PORTA。 我们刚才编写的全部代码将在START按钮按下一次时改变屏幕。当START再次按下时,我们需要把屏幕 复原。回想一下,START是个翻转按钮。在步骤9-12中,我们将实现应用的这一部分。这些步骤的说明 起始于246行的注释。 在262行,添加代码,把START按钮上的字符串改回“START”。如同在步骤5中所做的那样,我们将在 相应的控件API中使用pObj指针。不需要置位BTN_DRAW位,因为那是默认动作的一部分。 在267和269行,添加代码,把静态文本内的字符串更改为“SET TIME”。这将需要两行代码。注:静态 文本没有默认动作;因此不需要置位ST_DRAW状态位。 从274行开始,添加代码,用进度条替换EXIT按钮。EXIT按钮仍然存在于进度条之下。实际上,我们将用 此代码来交替启用这两个对象。请记住,将需要启用EXIT按钮,方法是清零BTN_DISABLED状态位。还 将需要重绘EXIT按钮,方法是置位其BTN_DRAW位。为什么呢?因为消息是针对START按钮的,所以将 发生的默认动作仅针对该按钮。 在287行,按照步骤8所述,调用SetLED()函数,熄灭点亮的任何LED。 Debug / Release Build All Program

3-6

1341 GFX2

结果
迄今为止,我们已经创建了烹饪菜单,对真实世界的一些基本功能(诸如微波炉应用)进行了模拟 。我 们使用按钮对象对定时器的初始值进行了控制。我们还改变了菜单上的信息(“Set Up Time”更改为 “Cooking”),显示菜单的当前状态。

代码分析
在本实验中,您学习了如何使用GOLMsgCallback()函数修改对象行为。使用每一对象提供的API,您已经 把多个对象联系起来构成了一个功能整体。根据用户动作,通过确定某一对象中的状态改变,对其他对象 即将产生的动作进行了控制。使用同样的状态改变,您已经知道如何添加代码来控制诸如LED这样的外部 功能部件,它可以代表诸如电机这样的真实世界模块。 创建的菜单仍然缺少通常能在真实应用中看到的功能。当START按钮按下时定时器还是没有启用,而且 我们希望静态文本中显示的状态文本将在计数递减到零时自动更改为显示“Done”状态。我们还希望当 计数递减到零时,Start按钮或Cancel按钮将自动翻转回到未按下状态。接下来的实验将向您展示如何实 现这些功能。

小结
既然已经知道如何使用GOLMsgCallback()来控制对象行为,您已经做好了了解GOLDrawCallback()函数 的准备,该函数也能控制对象行为。

3-7

1341 GFX2

本页故意留为空白

3-8

1341 GFX2

实验练习四
使用 GOLDrawCallback()的高级控制
实验目的
通过启动倒计时、对系统输入做出反应,增加我们烹饪屏幕的功能。在实验三中,按下START按钮将改变屏幕, 但不会开始倒计时。另外,为了返回到初始屏幕,用户不得不按下CANCEL。在本实验中,按下START按钮将开 始倒计时。倒计时完成时,屏幕将自动返回其初始状态。实验三中实现的GOLMsgCallback() 解决方案也将包含在 项目中。

需求
开发环境: 软件: C编译器: 硬件工具: MPLAB? v8.30 Microchip Graphics Library v1.75 Bitmap and Font Converter 用于PIC24及dsPIC器件的MPLAB? C编译器,或者 用于PIC32器件的MPLAB? C编译器 带PIC24FJ128GA010或PIC32MX360F512L PIM的Explorer 16 Graphics PICtail Plus子板,版本2.0或3.0 MPLAB? Real ICE或MPLAB? ICD3调试器 C:\RTC\HIF 2131\Lab4...

实验用电脑上的实验文件:

目标
1) 2) 3) 4) 基于GOLDrawCallback()函数中的定时器事件,实现自动控制。 一旦Start按钮被按下,递减编辑框和进度条,显示倒计时。 当Cancel按钮被按下时,停止倒计时。 相对于按钮按下事件,基于按钮按住事件实现控件动作。

预期结果
* 按下START或S4,将改变显示为右图所 示,并且将开始倒计时。 * 进度条将递减,显示烹饪进度。 * 时间到或者按下CANCEL或者按下S5, 将返回如左图所示的显示。 * 按住UP将增大编辑框中显示的时间(额 外练习) * 按住DOWN将减小编辑框中显示的时间 额外练习) 4-1

1341 GFX2

步骤
如果前一个项目还是打开的,首先必须关闭它,方法是从菜单中选择: File ? Close Workspace 然后,打开实验四的工作区,方法是从菜单中选择: File ? Open Workspace… 并且打开与您的开发板设置对应的工作区文件,文件位置是: C:\RTC\HIF 2131\Lab 4 选择: Lab4 PIC24.mcw,如果是带PIC24FJ128GA010 PIM的Explorer 16 Lab4 PIC32.mcw,如果是带PIC32MX360F512L PIM的Explorer 16

实验4参考信息
滴答定时器:在应用程序代码中已经实现了一个滴答计时例程。该例程使用来自Timer4的中断。定时 器被设置成约每秒钟中断一次,使用TickInit()函数(也已在应用程序代码中给出)进行初始化。 滴答计数将影响下列变量。 tick: prevTick: sideBtnTick: timeValue: varDiff: 全局变量,存放滴答计数值。 全局变量,存放旧的滴答计数值。 全局变量,存放用于侧按钮的滴答计数值。 全局变量,存放应用的剩余烹饪时间的当前值。此变量在编辑框中以分钟和 秒钟的形式显示。 局部变量,用来控制多长时间检查一次UP和DOWN按钮,从而检测按钮是否 仍然被按住。

控件信息:控件在CreateCookScreen()函数中创建。在GOLDrawCallback()函数中已经为您定 义好了控件指针。
控件 静态文本 编辑框(左) 编辑框(右) 按钮(UP) 按钮(DOWN) 按钮(START) 按钮(EXIT) 说明 显示烹饪状态 显示分钟 显示秒钟 增大时间值 减小时间值 开始烹饪过程(翻转) 返回主菜单 对象ID ID_STATUS ID_EDITBOX1 ID_EDITBOX2 ID_UP_BTN ID_DOWN_BTN ID_START_BTN ID_EXIT_BTN pStBtn pRetBtn 定义的指针 pSt pEb1 pEb2

4-2

1341 GFX2
在前一个实验中,向GOLMsgCallback()函数添加了代码,允许针对按钮按下定制系统响应。为了满足 本 实 验 的 要 求 , 在 GO LMs g Ca ll ba c k( ) 函 数中, 已 经 向 I D _ ST ART _ BTN 状 态 添 加 了 一 个 叫 做 CookEnable的全局标志。当START按钮按下时,此标志被置1,当CANCEL按钮按下时,此标志被清 零。

CookEnable Set?

no

no varDiff ms
Elapsed?

no

yes

yes
UP Pressed?

no

DOWN Pressed?

no

yes
Increment time count Redraw edit boxes

yes
Decrement time count Redraw edit boxes

1 Second Elapsed?

no

yes
Time Expired?

no

Decrement time count Redraw edit boxes Decrement progress bar Redraw bar portion Toggle LED

yes
Change button text Change status box text Add EXIT button over progress bar Enable EXIT button Turn off LED Sound buzzer Clear CookEnable flag

Return 1

4-3

1341 GFX2
在步骤1-4中,将添加代码,根据定时器值自动改变屏幕,请与按钮按下事件相比较。我们之所以在 GOLDrawCallback()中实现此功能,是因为我们很肯定地知道链表已经被解析过了。我们怎么会知道这 个?因为一旦GOLDraw()完成了解析链表,它就调用GOLDrawCallback()函数。 说明开始于Lab4.c文件163行的注释。从186行开始,添加代码,当烹饪时间到时把START按钮返回其初 始状态。由于此动作是基于系统事件而不是用户事件,必须添加代码,清零BTN_PRESSED状态并置位 BTN_DRAW状态。 从194行开始,添加代码,把EXIT按钮放置在进度条表面。此代码与在实验三中编写的相同。在这里再次 实现此代码,是因为我们响应的是不同的事件。请记住,为GOLMsgCallback()函数编写的代码行将不 会执行,除非CANCEL按钮被按下。 从203行开始,添加代码,在状态框中显示“DONE”。状态框是作为静态文本而被实现的。在这一步, 您将更改字符串并重绘静态文本控件。同样,代码与在实验三中编写的相同。在这里添加是因为我们响应 的是定时器事件而不是按钮按下事件。

实验四参考信息
使用图形库帮助文件来找出控件状态位以及控件相关的API。 开始 ? 程序 ? Microchip ? Graphics Library v1.65 ? Graphics Library Help 展开GOL Objects,然后展开你要查找的控件。状态位在[Widget] States小节中。[Widget]特定的API 列出在[Widget]小节中。 说明起始于219行。从228行开始,添加代码,减小进度条,显示剩下的烹饪时间,显示的是总烹饪时间 的百分比。进度条控件替我们处理了数学运算;因此我们所需要做的仅仅是调用正确的控件API并提供当 前时间。请参阅4-2页上的参考信息框,了解与时间变量有关的更多信息。不要忘记把进度条状态设置成 部分重绘。我们只需要绘制条形。 编译项目并对器件进行编程,验证步骤1-4是否成功完成。在此处,您将留意到,当按钮按住时,UP和 DOWN按钮并不会进行响应。该功能将在额外步骤中实现。如果还有时间,请继续。 Build All Program

4-4

1341 GFX2

额外的步骤
如果时间允许,我们将探索:只要UP或DOWN按钮被按住时,如何自动增加或减少编辑框中显示的值。 为此,我们将设定一个监控按钮并更新计数的时间间隔。此时间间隔使用称为varDiff的局部变量来进行设 定(说明请参阅4-2页)。为了避免与倒计时搞混淆,我们将只在CookEnable标志被清零时,检查按钮。 说明开始于Lab4.c文件中236行上的注释。删去245和266行上的注释符,使得代码块不再是注释。

从251行开始,添加代码,在增加或减少计数之后重绘编辑框。编译项目并对器件进行编程,验证操作是 否正确。 Build All Program

在161行声明并初始化变量varDiff。尝试改变该变量的值。增大数值会发生什么?减小数值又会发生什 么? 检查UpdateCtr()函数。此函数在Lab4.c中,起始于第548行。编辑框中的值是如何被更新的?使用 EbGetText() API,我们把当前字符串(对于本例是个数字)赋值给指针pTemp。此指针现在指向编辑框 结构体的Text域。函数word2xchar()通过把计数值转换为ASCII字符串,直接修改Text域。为什么我们不 得不添加代码置位编辑框的绘制状态位呢?

4-5

1341 GFX2

结果
本实验介绍了另一种基于应用程序变量修改对象行为的方法。向应用添加的功能使得在使用创建的菜单上 获得更佳的用户体验。现在烹饪屏幕已经完成。

代码分析
类似于GOLMsgCallback(),GOLDrawCallback()也可以用来修改对象行为。与依赖于消息的消息回调不 同,绘制回调对对象的改变可以使用系统级变量来实现。而且在绘制回调中,用户可以实现定制绘制,在 定制绘制中,对诸如线型、线宽、颜色和字体这样的全局绘制设置进行修改是安全的,并且对象的绘制不 会受到这些改动的影响。 在绘制回调中对象行为的修改可以由任何系统事件引发,诸如定时器中断、外部事件或全局变量等。

小结
在了解了如何根据消息和系统级变量对对象行为进行修改之后,您已经做好了了解对象和屏幕的高级管理 的准备。

4-6


相关文章:
更多相关标签: