硬汉嵌入式论坛

 找回密码
 立即注册
查看: 5851|回复: 0
收起左侧

[emWin教程入门篇] 【STemWin教程】第6章 STemWin文本显示

[复制链接]

740

主题

1326

回帖

3546

积分

管理员

春暖花开

Rank: 9Rank: 9Rank: 9

积分
3546
QQ
发表于 2015-1-9 15:04:04 | 显示全部楼层 |阅读模式
特别说明:完整STemWin的1-60期教程和配套实例下载地址:链接
第6章      STemWin文本显示


本期主要讲文本的显示,整体来说比较的简单,但很适合初学者看,有些文本函数在使用上要特别注意,教程中会给大家详细的讲解。
    6. 1  简单文本显示
    6. 2  文本绘制模式
    6. 3  GUI_DispStringInRectWrap函数的使用
    6. 4  开发板上面实现自动换行的例子
    6. 5  总结
6.1  简单文本显示
    讲解简单的文本显示前得说下控制字符,因为在使用STemwin来做一个文本阅读器时,了解这个很重要。控制字符是指字符代码小于32的字符。控制字符被定义为ASCII代码的一部分。emWin忽略了下表所列字符以外的所有控制字符:
字符代码
ASCII
C
描述
10
LF
\n
换行。
当前文本位置改变至下一行的开始。默认为:X= 0。
Y + =字体-距离 (单位:像素)(如例程GUI_GetFontDistY()计算得出)
13
CR
\r

回车。
当前文本位置改变至当前行的开始。默认为:X = 0。
    控制字符LF的用法在字符串中非常方便。换行符可以作为字符串的一部分,这样,字符串就可以拆分为多行,且只需调用一个例程就能显示。
    下面在emWin5.24的模拟器上面实现一下,下面的这个程序,主要是通过\n实现换行,模拟器的使用方法,看前面几期就会了。
  1. void MainTask(void)
  2. {
  3.      GUI_Init();(1)
  4.      /*  对于初学者,这个地方一定要注意,这里只是设置背景颜色,也就是给变量赋值了一下  */
  5.      GUI_SetBkColor(GUI_BLUE);
  6.      /* 要实现背景颜色的改变,必须的执行下面这句 */
  7.      GUI_Clear();
  8.      GUI_SetFont(&GUI_Font8x16);
  9.      /* 这里调用字符串显示  并实现一下换行  */
  10.      GUI_DispString("www.armfly.com \navailable");
  11.    
  12.      while (1)
  13.      {     
  14.          GUI_Delay(1000);(2)
  15.      }
  16. }
复制代码
1.    使用STemWin函数前,初始化一定要有。
2.    这里不仅仅是个延迟函数,窗口的刷新等功能最终是由这个函数实现的。
     实际显示效果如下:
6.1.png
函数GUI_DispStringAt()
        GUI_DispStringHCenterAt()
        GUI_DispStringInRect() 平时使用的也比较多,有兴趣的可以在模拟器上面练练手。
6.2  文本绘制模式
    通常,在所选窗口的当前文本位置,使用所选字体以正常文本模式写入文本。正常文本模式意思是指文本覆盖已经显示的任何内容,在这种情况下,字符掩码中设定的位元在屏幕上被设定。在这种模式下,活动位元使用前景颜色写入,而非活动位元用背景颜色写入。但在某些情况下,需要更改这种默认模式。STemWin为此提供了四种可以组合使用的标记 (一种默认加三种修改标记):
正常文本
    通过指定GUI_TEXTMODE_NORMAL或0,可以正常显示文本。
反转文本
    通过指定GUI_TEXTMODE_REV,可以反转显示文本。通常的黑底白字显示方式将变为白底黑字显示。
透明文本
    通过指定GUI_TEXTMODE_TRANS,可以显示为透明文本。透明文本表示文本写在屏幕上已经可见的内容之上。不同之处在于,屏幕上原有的内容仍然可见,而在正常文本中,背景会替换为当前选择的背景色。
异或文本
    通过指定GUI_TEXTMODE_XOR,可以使用异或模式显示文本。通常情况下,用白色绘制的 (实际字符)显示是反相的。如果背景色是黑色,效果与默认模式(正常文本)是一样的。如果背景是白色,输出与转文本一样。如果使用彩色,反相的像素由下式计算:
新像素颜色=颜色的值–实际像素颜色–1。
透明反转文本
    通过指定GUI_TEXTMODE_TRANS | GUI_TEXTMODE_REV,可以显示为透明反转文本。与透明文本一样,它不会覆盖背景,而且和反转文本一样,该文本会反转显示。其他信息请注意,还可以使用缩写形式:例如,GUI_TM_NORMAL。
  1. void MainTask(void)
  2. {   
  3.      GUI_Init();
  4.      /* 设置字体 */   
  5.      GUI_SetFont(&GUI_Font8x16);
  6.      /* 设置背景颜色 */   
  7.      GUI_SetBkColor(GUI_BLUE);
  8.      GUI_Clear();      
  9.      /* 设置画笔的粗细以及颜色,只有矢量函数才能设置Size */
  10.      GUI_SetPenSize(10);   
  11.      GUI_SetColor(GUI_RED);
  12.      GUI_DrawLine(80, 10, 240, 90);   
  13.      GUI_DrawLine(80, 90, 240, 10);
  14.      GUI_SetBkColor(GUI_BLACK);
  15.      GUI_SetColor(GUI_WHITE);      
  16.      /* 设置正常模式 */
  17.      GUI_SetTextMode(GUI_TM_NORMAL);  
  18.      GUI_DispStringHCenterAt("GUI_TM_NORMAL" , 160, 10);
  19.      /* 翻转文本 */   
  20.      GUI_SetTextMode(GUI_TM_REV);
  21.      GUI_DispStringHCenterAt("GUI_TM_REV" , 160, 26);        
  22.      /* 透明文本 */
  23.      GUI_SetTextMode(GUI_TM_TRANS);   
  24.      GUI_DispStringHCenterAt("GUI_TM_TRANS" , 160, 42);
  25.      /* 异或文本 */   
  26.      GUI_SetTextMode(GUI_TM_XOR);
  27.      GUI_DispStringHCenterAt("GUI_TM_XOR" , 160, 58);   
  28.      /* 设置文本模式 */
  29.      GUI_SetTextMode(GUI_TM_TRANS | GUI_TM_REV);   
  30.      GUI_DispStringHCenterAt("GUI_TM_TRANS | GUI_TM_REV", 160, 74);
  31.      while (1)   
  32.      {
  33.          GUI_Delay(1000);   
  34.      }
  35. }
复制代码
    实际显示效果如下:
6.2.png
    关于文本设置方面还有一个函数这个里面还有一个函数GUI_SetTextStyle(),有兴趣的可以试试。
6.3.png
6.3  GUI_DispStringInRectWrap函数的使用
    先贴一下官方的使用说明
6.4.png
    下面这个例子非常的好,很好的说明了三种模式的区别
  1. #include "GUI.h"
  2. int i;
  3. char acText[] = "This example demonstrates text wrapping";
  4. GUI_RECT Rect = {10, 10, 59, 59};
  5. GUI_WRAPMODE aWm[] = {GUI_WRAPMODE_NONE,
  6.                       GUI_WRAPMODE_CHAR,
  7.                       GUI_WRAPMODE_WORD};
  8. void MainTask(void)
  9. {
  10.     GUI_Init();
  11.     GUI_SetTextMode(GUI_TM_TRANS);
  12.     for (i = 0; i < 3; i++)
  13.     {
  14.         GUI_SetColor(GUI_BLUE);
  15.         GUI_FillRectEx(&Rect);
  16.         GUI_SetColor(GUI_WHITE);
  17.         GUI_DispStringInRectWrap(acText, &Rect, GUI_TA_LEFT, aWm[i]);
  18.         Rect.x0 += 60;
  19.         Rect.x1 += 60;
  20.     }
  21.     while (1)
  22.     {
  23.         GUI_Delay(10);
  24.     }
  25. }
复制代码
    实际显示效果如下:
6.5.png
6.4  开发板上实现自动换行的例子
    下面是在开发板上面实现的自动换行例子:
  1. #include "GUI.h"
  2. int i;
  3. char acText[] = "www.armfly.com  www.armfly.taobao.com Eric2013";
  4. GUI_RECT Rect = {10, 10, 59, 59};
  5. GUI_WRAPMODE aWm[] = {GUI_WRAPMODE_NONE,
  6.                       GUI_WRAPMODE_CHAR,
  7.                       GUI_WRAPMODE_WORD};
  8. /*
  9. *********************************************************************************************************
  10. *    函 数 名: MainTask
  11. *    功能说明: GUI主函数
  12. *    形    参:无
  13. *    返 回 值: 无
  14. *********************************************************************************************************
  15. */
  16. void MainTask(void)
  17. {
  18.     GUI_Init();
  19.     GUI_SetTextMode(GUI_TM_TRANS);
  20.     for (i = 0; i < 3; i++)
  21.     {
  22.         GUI_SetColor(GUI_BLUE);
  23.         GUI_FillRectEx(&Rect);
  24.         GUI_SetColor(GUI_WHITE);
  25.         GUI_DispStringInRectWrap(acText, &Rect, GUI_TA_LEFT, aWm[i]);
  26.         Rect.x0 += 60;
  27.         Rect.x1 += 60;
  28.     }
  29.     while (1)
  30.     {
  31.         GUI_Delay(10);
  32.     }
  33. }
复制代码
    将上面的代码复制到工程中的MainTask.c文件即可。
6.6.jpg
    实际显示效果如下:
6.7.png

6.5  总结
文本的显示属于最基本的功能,初学者要多练练这些相关的函数,实践出真知。要不以后做一些复杂的例子,往往就是这些简单的地方出错。
努力打造安富莱高质量微信公众号:点击扫描图片关注
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-4 08:51 , Processed in 0.163874 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表