1、文本显示
(1)文本显示 API

(2)重要函数
void GUI_DispCEOL(void);
将当前窗口(或显示)中的当前行从当前文本位置清除到窗口末尾,行高度为当前字体的高度。
void GUI_DispStringInRectWrap(const char * s, GUI_RECT * pRect, int TextAlign, GUI_WRAPMODE WrapMode);
在当前窗口中, 使用当前字体在指定矩形内的指定位置显示字符串, 并可选择换行模式。
1) s: 想要显示的字符串
2) pRect: 要写入的矩形(以像素为单位)。
3) TextAlign: 对齐标志。可使用“或”操作进行组合。水平对齐标志和垂直对齐标志应该组合使用。
4) WrapMode: 换行模式。有三种换行模式,分别是:
GUI_WRAPMODE_NONE: 不执行自动换行;
GUI_WRAPMODE_WORD: 按照字对齐,对文本进行自动换行;
GUI_WRAPMODE_CHAR: 按照字符对齐,对文本进行自动换行。
int GUI_SetTextMode(int TextMode);
按照指定的参数设置文本绘制模式。
1) TextMode:要设置的文本模式。 可以是 TEXTMODE 标志的任意组合。
这些参数值可通过“或”操作进行组合使用,例如透明反转文本就是通过参数GUI_TM_TRANS | GUI_TM_REV 设置的, 此绘制模式是透明文本和反转文本的组合, 与透明文本一样,它不会覆盖背景,而且和反转文本一样,该文本会反转显示。
int GUI_SetTextAlign(int TextAlign);
为当前窗口中的字符串显示设置文本对齐方式。
1) TextAlign: 要设置的文本对齐方式。 允许的值如下,可使用“或”操作进行组合:
水平对齐方式: GUI_TA_LEFT、 GUI_TA_HCENTER、 GUI_TA_RIGHT
垂直对齐方式: GUI_TA_TOP、 GUI_TA_VCENTER、 GUI_TA_BOTTOM
WM_MULTIBUF_Enable()函数是开启自动使用多帧缓冲功能, 此功能可以有效的缓解控件移动或某些绘图操作产生的画面撕裂, 并可在一定程度上提升系统流畅度。 开启自动使用多帧缓冲后, emWin 的窗口管理器会将所有绘图函数的输出重定向到不可见的后台缓冲区,然后再绘制无效的窗口, 绘制完最后一个无效窗口后,窗口管理器使后台缓冲区可见。 不过此功能仅当显示驱动程序支持多个缓冲区且内存足以存储至少 2 个帧缓冲区时才可用。
首先设置桌面背景颜色 。这里需要注意的是,调用GUI_SetBkColor()后并不会更新桌面的背景颜色, 需要在这之后调用 GUI_Clear()才会更新。接着是设置字体大小, emWin 内置了很多不同的字体大小,这里我们选择字体大小为 32的字体。 然后绘制背景图形,GUI_SetPenSize 函数和 GUI_DrawLine 函数会在 2D 绘图章节中讲解。 设置完背景颜色和图形之后,开始设置字体背景色和字体颜色,设置接下来需要显示的字体大小,然后依次显示不同绘制模式的字体, GUI_DispStringHCenterAt 函数的功能是在指定位置显示水平居中的字符串,该函数的坐标参数是字符串的居中点坐标,而不是起始坐标。在矩形框中绘制文本时,使用 for 循环来绘制三个不同对齐方式的矩形框文本。 在 while(1)中延时 100 毫秒,方便其他任务的运行。
2、数值显示
(1)数值显示 API
3、2D 绘图
包括画点、 画线,绘制矩形、 圆、 椭圆、 扇形、 多边形和位图等平面图形,甚至还能生成二维码。
(1)较为常用的基本 2D 绘图 API 函数表
(2)绘图 API
① U8 GUI_SetLineStyle(U8 LineStyle); 设置直线的绘制样式。
- GUI_LS_SOLID: 直线将绘制为视线(默认);
- GUI_LS_DASH: 直线将被绘制为虚线;
- GUI_LS_DOT: 直线将被绘制为点线;
- GUI_LS_DASHDOT: 线条将绘制成一个破折号和一个点交替的形式;
- GUI_LS_DASHDOTDOT: 线条将绘制成破折号和双点交替的形式。
② void GUI_DrawLine(int x0, int y0, int x1, int y1);从指定起点绘制一条线到当前窗口中的指定终结点(绝对坐标)。
- x0:起始位置的 X 轴坐标;
- y0:起始位置的 Y 轴坐标;
- x1:终点位置的 X 轴坐标;
- y1:终点位置的 Y 轴坐标。
③ void GUI_DrawRect(int x0, int y0, int x1, int y1);在当前窗口中的指定位置绘制矩形。
- x0:矩形右上角的 X 轴坐标;
- y0:矩形右上角的 Y 轴坐标;
- x1:矩形左下角的 X 轴坐标;
- y1:矩形左下角的 Y 轴坐标。
④ void GUI_FillRect(int x0, int y0, int x1, int y1);在当前窗口中的指定位置绘制带填充的矩形。
参数同上,但效果不同。
⑤ void GUI_DrawRoundedFrame(int x0, int y0, int x1, int y1, int r, int w)在当前窗口中的指定位置绘制圆角矩形框,可指定圆角大小和边框宽度。
- x0:矩形右上角的 X 轴坐标;
- y0:矩形右上角的 Y 轴坐标;
- x1:矩形左下角的 X 轴坐标;
- y1:矩形左下角的 Y 轴坐标;
- r:圆角半径;
- w:边框宽度。
⑥ void GUI_FillRoundedRect(int x0, int y0, int x1, int y1, int r);在当前窗口中的指定位置绘制带填充的圆角矩形。
- x0:矩形右上角的 X 轴坐标;
- y0:矩形右上角的 Y 轴坐标;
- x1:矩形左下角的 X 轴坐标;
- y1:矩形左下角的 Y 轴坐标;
- r:圆角半径。
⑦ void GUI_DrawGradientV(int x0, int y0, int x1, int y1, GUI_COLOR Color0, GUI_COLOR Color1);绘制使用垂直渐变颜色填充的矩形。
- x0:矩形右上角的 X 轴坐标;
- y0:矩形右上角的 Y 轴坐标;
- x1:矩形左下角的 X 轴坐标;
- y1:矩形左下角的 Y 轴坐标;
- Color0:要在矩形最顶层绘制的颜色;
- Color1: 要在矩形最底层绘制的颜色。
⑧ void GUI_DrawGradientRoundedV(int x0, int y0, int x1, int y1, int rd,GUI_COLOR Color0, GUI_COLOR Color1);绘制使用水平渐变颜色填充的圆角矩形。
- x0:矩形右上角的 X 轴坐标;
- y0:矩形右上角的 Y 轴坐标;
- x1:矩形左下角的 X 轴坐标;
- y1:矩形左下角的 Y 轴坐标;
- rd:圆角半径;
- Color0:要在矩形最顶层绘制的颜色;
- Color1: 要在矩形最底层绘制的颜色。
(3)Alpha 混合
Alpha 混合(Alpha Blending) 是一种将半透明前景色与背景色相结合产生新的混合色,从而实现透明度效果的过程。前景色的半透明度可以从完全透明到完全不透明不等。 如果前景色完全透明,则新的混合色就是背景色; 相反,如果它是完全不透明的, 则新的混合色就是前景色。半透明度可以在这些极端值之间变化。 混合颜色由前景色和背景色以及各自的透明度通过加权平均计算得出。
① unsigned GUI_EnableAlpha(unsigned OnOff);启用或禁用自动 Alpha 混合。
- OnOff: 1 启用自动 Alpha 混合, 0 禁用。
- 返回值:设置前的状态。
② unsigned GUI_SetAlpha(U8 Value);为所有后续绘图操作启用软件 Alpha 混合。
- Value: 要用于所有后续绘图操作的 Alpha 值,默认为完全不透明。
- 返回值: 上一次 Alpha 混合的值。
- 注意: 在标有 ARGB 后缀的 emWin 核心库中, Alpha 通道值为 0 表示完全透明, 255表示完全不透明。 而无此后缀的核心库则相反, 255 表示完全透明, 0 表示完全不透明
Alpha 混合完全自动执行,用户只需要调用 GUI_EnableAlpha()使能 Alpha 混合,然后在设置颜色的时候添加 Alpha 通道值即可。 32 位 ARGB 颜色空间的最高 8 位用作 Alpha 值的设置。 由于 Alpha 混合会增加处理器的负担, 所以在使用完后一定记得禁止自动 Alpha混合。 需要注意一点, 如果使用 emWin 官方定义好的颜色宏来指定图形颜色, 那么 Alpha混合是无效的,只能直接输入十六进制的颜色数值才能让 Alpha 混合起效,具体原因目前暂不清楚。
(4)多边形和圆相关绘图
① void GUI_DrawPolygon(const GUI_POINT * pPoint, int NumPoints, int x, int y);在当前窗口中绘制由点列表定义的多边形轮廓。
- pPoint: 指向需要显示的多边形的点列表指针;
- NumPoints:点列表中指定的点数;
- x:多边形各点在 x 轴上的整体偏移量;
- y:多边形各点在 y 轴上的整体偏移量。
此函数用于绘制多边形线框,线框的样式可通过 GUI_SetLineStyle()函数修改,也就是说,更改直线的绘制样式可以让 GUI_DrawPolygon()绘制出相应样式的多边形线框。 点列表中的各点必须按顺序排列,否则出错。
② void GUI_FillPolygon(const GUI_POINT * pPoint, int NumPoints, int x, int y);在当前窗口中绘制由点列表定义的带填充的多边形。
- pPoint:指向需要显示的多边形的点列表指针;
- NumPoints:点列表中指定的点数;
- x:多边形各点在 x 轴上的整体偏移量;
- y:多边形各点在 y 轴上的整体偏移量。
此函数用于绘制填充多边形, 不受 GUI_SetLineStyle()函数的影响。点列表中的各点必须按顺序排列,否则出错。
③ void GUI_DrawCircle(int x0, int y0, int r);在当前窗口中的指定位置绘制指定尺寸的线框圆。
- x0:圆心 x 轴坐标;
- y0:圆心 y 轴坐标;
- r:圆的半径。
④ void GUI_FillCircle(int x0, int y0, int r);在当前窗口中的指定位置绘制指定尺寸的填充圆。
参数同上,但效果不同。
⑤ void GUI_DrawEllipse(int x0, int y0, int rx, int ry);在当前窗口的指定位置绘制指定尺寸的线框椭圆。
- x0:圆心 x 轴坐标;
- y0:圆心 y 轴坐标;
- rx: x 轴方向的半径;
- 4ry: y 轴方向的半径。
⑥ void GUI_FillEllipse(int x0, int y0, int rx, int ry);在当前窗口的指定位置绘制指定尺寸的填充椭圆。
参数同上,但效果不同
⑦ void GUI_DrawArc(int xCenter, int yCenter, int rx, int ry, int a0, int a1);在当前窗口的指定位置绘制指定尺寸的圆弧。 圆弧是线框圆的一部分。
- xCenter: 圆弧的圆心 x 轴坐标;
- yCenter:圆弧的圆心 y 轴坐标;
- rx: x 轴方向的半径;
- ry: y 轴方向的半径;
- a0:起始角度;
- a1:终止角度
⑧ 饼图绘制函数
/**
* @brief 饼图绘图函数
* @note 无
* @param x0:饼图圆心的 x 坐标
* y0:饼图圆心的 y 坐标
* r:饼图半径
* @retval 无
*/
static void Pie_Chart_Drawing(int x0, int y0, int r)
{
int i, a0 = 0, a1 = 0;
for (i = 0; i < GUI_COUNTOF(aValues); i++) {
if (i == 0) a0 = 0;
else a0 = aValues[i - 1];
a1 = aValues[i];
GUI_SetColor(aColor[i]);
GUI_DrawPie(x0, y0, r, a0, a1, 0);
}
}
(5)绘制二维码
emWin 从 5.34 版本开始新增了可以生成和显示二维码(QR Code) 的功能,这个功能一共只有四个 API 函数, 而且使用起来非常的方便。
① GUI_HMEM GUI_QR_Create(const char * pText, int PixelSize, int EccLevel, int Version);创建一张二维码位图。
- pText: 需要制作成二维码的 UTF-8 编码的文本;
- PixelSize:单个数据色块的大小 (以像素为单位);
- EccLevel:要使用的纠错编码等级, 可选的纠错编码等级如下:
- GUI_QR_ECLEVEL_L: 可以恢复 7%的数据;
- GUI_QR_ECLEVEL_M: 可以恢复 15%的数据;
- GUI_QR_ECLEVEL_Q: 可以恢复 25%的数据;
- GUI_QR_ECLEVEL_H: 可以恢复 30%的数据。
- Version:二维码版本号,用于规定生成的二维码的尺寸。 如果设置为 0(推荐),将自动计算大小。必须介于 1 和 40 之间。如果它小于给定文本与给定 EccLevel所需的值,则该函数将失败。
- 返回值: 成功时返回位图的句柄,出错时返回 0。
② void GUI_QR_Delete(GUI_HMEM hQR);释放用于二维码的内存。
- hQR: 需要删除的二维码句柄。
- 如果不再使用二维码, 则应将其删除,以免出现某些未知错误。
③ void GUI_QR_Draw(GUI_HMEM hQR, int xPos, int yPos);在指定的位置绘制指定的二维码。
- hQR:需要显示的二维码句柄;
- xPos:需要显示位置的 x 轴坐标;
- yPos:需要显示位置的 y 轴坐标。
④ void GUI_QR_GetInfo(GUI_HMEM hQR, GUI_QR_INFO * pInfo);返回包含有关指定二维码代码信息的结构体。
- hQR:二维码句柄;
- pInfo: 指向 GUI_QR_INFO 类型的 结构体指针。