你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【安富莱STemWin教程】第6章 STemWin文本显示

[复制链接]
baiyongbin2009 发布时间:2015-1-10 13:40
本帖最后由 baiyongbin2009 于 2015-1-10 13:42 编辑 9 i3 ^/ W( q7 h) G  [3 g% b

) ~5 ]8 u- a" \' W3 a4 b+ y9 j

特别说明:完整STemWin的1-60期教程和配套实例下载地址:链接

第6章      STemWin文本显示
6 x' m0 ]. l, p; F' U3 r9 Q1 {
      本期主要讲文本的显示,整体来说比较的简单,但很适合初学者看,有些文本函数在使用上要特别注意,教程中会给大家详细的讲解。
    6. 1  简单文本显示
    6. 2  文本绘制模式
    6. 3  GUI_DispStringInRectWrap函数的使用
    6. 4  开发板上面实现自动换行的例子
    6. 5  总结

: H5 ~  c" O5 g) m- p; U
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); z, N$ B8 B; q# o
  2. {
    6 {6 {1 o) l# ?: y0 a1 O& \
  3.      GUI_Init();(1)
    ! }, J% C! Q. l) K
  4.      /*  对于初学者,这个地方一定要注意,这里只是设置背景颜色,也就是给变量赋值了一下  */ & E1 [5 v1 X3 G; D1 ~
  5.      GUI_SetBkColor(GUI_BLUE);
    1 Z, ~2 ]! l' @/ M
  6.      /* 要实现背景颜色的改变,必须的执行下面这句 */
    5 p( ^7 f$ h6 u' i8 q' b7 T  V# @4 R
  7.      GUI_Clear();
    # O& E" ]) A9 q; ^4 U* D
  8.      GUI_SetFont(&GUI_Font8x16); - u) l$ o" w( q2 D
  9.      /* 这里调用字符串显示  并实现一下换行  */
    1 W, c- p' N$ N4 u- D9 @
  10.      GUI_DispString("www.armfly.com \navailable"); ! \4 y* S. @- B* e4 ?# u9 A
  11.     . m4 o( y/ N; h, m( ]  D. v
  12.      while (1)
    0 i2 V* _& f) m
  13.      {     
    ' z3 o, @, r, x/ Y
  14.          GUI_Delay(1000);(2)
    / x, v) s% c4 a& c, }2 Q
  15.      }9 n* i& k% }; ]% c  V
  16. }
复制代码
1.    使用STemWin函数前,初始化一定要有。
2.    这里不仅仅是个延迟函数,窗口的刷新等功能最终是由这个函数实现的。
       实际显示效果如下:
6.1.png
7 a0 j5 ^& ^8 H. @
函数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)
    ( g2 X; K& b! I/ |4 A* I- X
  2. {   
    5 M/ Q" E; Z4 t: _: ]
  3.      GUI_Init();
    & \+ K" }% A/ W' B
  4.      /* 设置字体 */   0 r% G9 n0 F) e* h4 W
  5.      GUI_SetFont(&GUI_Font8x16);1 Q4 l1 l6 B/ B
  6.      /* 设置背景颜色 */   
    ! d8 t+ p0 q" W7 g, M
  7.      GUI_SetBkColor(GUI_BLUE);8 Q5 G" P" C; m+ I; x$ R7 V  y. }
  8.      GUI_Clear();      % P& l4 ?6 m# e' K8 U' [
  9.      /* 设置画笔的粗细以及颜色,只有矢量函数才能设置Size */' I% Y  Q2 b, D* M- `  x
  10.      GUI_SetPenSize(10);   
    & P0 l: q9 i. O) [. h3 l& N4 d
  11.      GUI_SetColor(GUI_RED);" ~; z2 O3 D5 T" `; z3 W% ^4 n
  12.      GUI_DrawLine(80, 10, 240, 90);   
    % B4 X) j- F- O, G5 Z) L+ ?
  13.      GUI_DrawLine(80, 90, 240, 10);9 O: D! T9 D0 p) L$ X! O
  14.      GUI_SetBkColor(GUI_BLACK);
    % V0 k. y- ^& p; @) Q" b
  15.      GUI_SetColor(GUI_WHITE);      $ B1 H* ]: N4 j) L
  16.      /* 设置正常模式 */' p3 G- f1 @6 ]0 z# O
  17.      GUI_SetTextMode(GUI_TM_NORMAL);    q' m" F; l( T  E/ V+ `
  18.      GUI_DispStringHCenterAt("GUI_TM_NORMAL" , 160, 10);
    % J& U: @: w+ P% W/ L
  19.      /* 翻转文本 */   
    5 D9 C6 t. t$ }
  20.      GUI_SetTextMode(GUI_TM_REV);) E" A- }- U. v1 P. `9 C  d$ o" N) \
  21.      GUI_DispStringHCenterAt("GUI_TM_REV" , 160, 26);        $ A( i+ A6 p+ U/ s: C
  22.      /* 透明文本 */$ [: W2 F; }! h% [  d4 \
  23.      GUI_SetTextMode(GUI_TM_TRANS);   * D8 E7 d! p5 r* M0 p" |  b
  24.      GUI_DispStringHCenterAt("GUI_TM_TRANS" , 160, 42);5 b: H3 e1 ^1 b6 [  q" Y0 U
  25.      /* 异或文本 */   ' `0 g: ^: c: P9 m: e$ O7 @, K) o
  26.      GUI_SetTextMode(GUI_TM_XOR);
    : Y3 O# I; K+ ?0 v; z4 d* S+ h
  27.      GUI_DispStringHCenterAt("GUI_TM_XOR" , 160, 58);    ' x( U& `, f$ S4 |6 X: A8 T
  28.      /* 设置文本模式 */2 r" v" h# q0 ?  A% a$ _( j6 [' ^' y: g
  29.      GUI_SetTextMode(GUI_TM_TRANS | GUI_TM_REV);   1 B$ T4 F1 ]2 r: q$ v- L
  30.      GUI_DispStringHCenterAt("GUI_TM_TRANS | GUI_TM_REV", 160, 74);- K" B3 A; t# c8 G+ ^
  31.      while (1)   7 }1 {, c9 g6 X3 B9 u; B$ x
  32.      {* h: [7 C# q! {. P2 m
  33.          GUI_Delay(1000);   * h; h+ \+ o# m6 R: F: d- ?
  34.      }
    + X0 ?: I% [! G+ k% K( v
  35. }
复制代码
    实际显示效果如下:
6.2.png
+ i1 A/ h0 b5 y) @
    关于文本设置方面还有一个函数这个里面还有一个函数GUI_SetTextStyle(),有兴趣的可以试试。
6.3.png

' ^9 r( E  }8 F9 ~" x
6.3  GUI_DispStringInRectWrap函数的使用
    先贴一下官方的使用说明
6.4.png
/ c6 S- m' Y* L/ U! J, o5 |
    下面这个例子非常的好,很好的说明了三种模式的区别
  1. #include "GUI.h"8 I8 R! H1 j; V, W
  2. 8 \  ]1 v, F1 o- u) J
  3. int i;
    3 `1 j3 u6 `$ u1 C" R- K
  4. char acText[] = "This example demonstrates text wrapping";$ r8 I5 G, L3 i& E
  5. GUI_RECT Rect = {10, 10, 59, 59};
    - X; Z" @2 }$ d- ~7 P* E
  6. GUI_WRAPMODE aWm[] = {GUI_WRAPMODE_NONE,
    - A. C% ?' T: K0 ?! W6 g' c: j6 ~' N9 B
  7.                       GUI_WRAPMODE_CHAR,0 M$ e8 {* Z" U- L0 `# l3 i
  8.                       GUI_WRAPMODE_WORD};6 Z, N2 ^7 ^2 l  O1 t
  9. void MainTask(void)3 [! ]5 S. F- T+ h9 C1 Z
  10. {; r! y, O: S2 o* F9 D* u# O9 x' r- O
  11.     GUI_Init();& i) y  M: f: L- {& }# n4 k
  12.     GUI_SetTextMode(GUI_TM_TRANS);
    4 a& B. }- W8 E
  13.     for (i = 0; i < 3; i++)
    8 M( h0 i/ ?9 F5 t$ c: N, f( h
  14.     {" x+ B* h3 y+ Y& j  C$ o
  15.         GUI_SetColor(GUI_BLUE);
    # N9 d# w8 I3 d' W. Z4 B# p7 `
  16.         GUI_FillRectEx(&Rect);
    * u6 W( ~1 M1 d
  17.         GUI_SetColor(GUI_WHITE);
    . Y% Q# ?& |  \' t& G
  18.         GUI_DispStringInRectWrap(acText, &Rect, GUI_TA_LEFT, aWm[i]);1 v+ B# ^4 {2 }4 n2 F$ O# c
  19.         Rect.x0 += 60;
    & _. @7 C1 C& |0 i- ^  ~0 s
  20.         Rect.x1 += 60;3 Y/ k; E/ s4 l% E0 P& l
  21.     }' j' q* k" T3 K' E
  22.     while (1)  D  {3 ]8 F8 H2 s. i' r
  23.     {, v$ J, e) e; l0 L. A
  24.         GUI_Delay(10);& h0 o2 f0 L5 N- c2 ]
  25.     }% P4 }; j2 }1 r" j2 w; _3 b
  26. }
复制代码
    实际显示效果如下:
6.5.png

7 ?/ p" D# ?3 `
; _# z  d7 ~; `4 s# y. E- t& q. \  M1 {6 N

2 d- T9 N( k6 A. q3 l  K
赞 收藏 评论1 发布时间:2015-1-10 13:40

举报

1个回答
baiyongbin2009 回答时间:2015-1-10 13:40:50
6.4  开发板上实现自动换行的例子
    下面是在开发板上面实现的自动换行例子:
  1. #include "GUI.h". K) d- Y7 B6 k' L' |

  2. 2 n+ S2 r' S) ?3 E$ S: f7 q
  3. int i;
    ; o6 t5 h5 P; l" P1 U8 F
  4. char acText[] = "www.armfly.com www.armfly.taobao.com Eric2013";
    ! v0 B$ ^9 @# A/ E
  5. GUI_RECT Rect = {10, 10, 59, 59};
    ) |3 F( @* [# @6 \9 E' e& `
  6. GUI_WRAPMODE aWm[] = {GUI_WRAPMODE_NONE,
    : J, j+ V9 u1 ]) w9 L; {3 s% e; l
  7. GUI_WRAPMODE_CHAR,
    / w; Q, K- j, y0 L' o8 N; \( m
  8. GUI_WRAPMODE_WORD};
    1 j/ ^; D& f% T- t) h, z/ M$ h4 t. R
  9. /*
    3 e# e: d. j" ^( L4 O' v7 B
  10. *********************************************************************************************************" j# [5 U1 M2 J; }2 ^; D9 _3 A
  11. * 函 数 名: MainTask' _# L( t6 K: Z' b7 c
  12. * 功能说明: GUI主函数
    ) m( L8 ?9 I3 T/ {. ~" H
  13. * 形 参:无3 {$ U3 a) o  p( b
  14. * 返 回 值: 无
    # W* q- q8 Q/ K7 a
  15. *********************************************************************************************************7 I! S0 h3 t4 i
  16. */5 D, \7 G7 ~4 g5 V$ a/ l
  17. void MainTask(void)
    ' T& N0 S6 X' b! W. C
  18. {
    4 {. ~* l/ H' `" ~. G
  19. GUI_Init();
    ( n1 \- O2 v4 d
  20. GUI_SetTextMode(GUI_TM_TRANS);: k( b' f: n5 v% C* a
  21. for (i = 0; i < 3; i++)
    + f3 f/ A+ Z; n+ c3 F
  22. {
    7 |9 X9 w2 o" y( O! L! V
  23. GUI_SetColor(GUI_BLUE);
    " T& a/ ^9 Y4 z: D. r
  24. GUI_FillRectEx(&Rect);
    ; H, \% f3 Z4 v( m$ m+ Q
  25. GUI_SetColor(GUI_WHITE);
    " m0 ^' ]) R! r' q7 G7 m3 ~; G- ^
  26. GUI_DispStringInRectWrap(acText, &Rect, GUI_TA_LEFT, aWm[i]);
    " X' O4 n; q6 u2 ]4 x
  27. Rect.x0 += 60;
    $ s( C) ~$ D  n' W' }; g  y+ b
  28. Rect.x1 += 60;4 S8 P4 h/ g( v$ O- J
  29. }
    * A% p& }9 B( {" @! O0 q% z* {
  30. while (1)" V( ]3 J3 H, j  s5 L
  31. {
    + h" K; y+ l- U2 \. y
  32. GUI_Delay(10);
    ' g2 E; `4 a$ ]/ d% o) E
  33. }+ `1 Z6 N6 d$ q5 v
  34. }
复制代码
    将上面的代码复制到工程中的MainTask.c文件即可。
6.6.jpg
    实际显示效果如下:
6.7.png
6.5  总结
    文本的显示属于最基本的功能,初学者要多练练这些相关的函数,实践出真知。要不以后做一些复杂的例子,往往就是这些简单的地方出错。

3 \( [) ~8 f% x1 A
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版