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

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

[复制链接]
baiyongbin2009 发布时间:2015-1-10 13:40
本帖最后由 baiyongbin2009 于 2015-1-10 13:42 编辑
2 V8 m4 e2 D) B% ?. M1 w( y: C

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

第6章      STemWin文本显示

/ d" \& [' ^4 X: T
      本期主要讲文本的显示,整体来说比较的简单,但很适合初学者看,有些文本函数在使用上要特别注意,教程中会给大家详细的讲解。
    6. 1  简单文本显示
    6. 2  文本绘制模式
    6. 3  GUI_DispStringInRectWrap函数的使用
    6. 4  开发板上面实现自动换行的例子
    6. 5  总结
- G1 W0 F2 f* m. X# L3 I( C
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)
    7 i" W; R8 m5 f; q4 O- K
  2. {
    / D: ~' Q6 j' \+ X
  3.      GUI_Init();(1), h; t( e7 g! Q: \  I4 V3 G
  4.      /*  对于初学者,这个地方一定要注意,这里只是设置背景颜色,也就是给变量赋值了一下  */ 9 H- |- I3 W1 T( x" z  {) `& ~
  5.      GUI_SetBkColor(GUI_BLUE);
    ) Y4 N; p* a) L) b* x* S. @
  6.      /* 要实现背景颜色的改变,必须的执行下面这句 */
    2 \; A7 E* `3 H; c2 z
  7.      GUI_Clear();
    ; N# z3 J4 Z( i! @- m
  8.      GUI_SetFont(&GUI_Font8x16);
    & P1 d! n7 `4 a3 l% o
  9.      /* 这里调用字符串显示  并实现一下换行  */# |' ]  l, k3 X! ~) c( d; N
  10.      GUI_DispString("www.armfly.com \navailable");
    2 L4 y1 i6 v* O) D" _% D
  11.       h3 S' P& ^7 P4 l( D5 o  ?
  12.      while (1)% G1 s) X2 S& j4 u2 A. \
  13.      {     
    , D1 H; @) A; e2 j& Y+ ]# X+ z- K
  14.          GUI_Delay(1000);(2)0 V: ]8 |% V0 l1 {3 ]1 f
  15.      }) q5 i  s& `( a
  16. }
复制代码
1.    使用STemWin函数前,初始化一定要有。
2.    这里不仅仅是个延迟函数,窗口的刷新等功能最终是由这个函数实现的。
       实际显示效果如下:
6.1.png
: L6 c5 x. h0 T3 m$ _
函数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)
    * Q4 _" d4 }2 @5 i4 E
  2. {   9 r3 [4 d- F, t: g$ o. t7 n! h
  3.      GUI_Init();9 x: W' a% T/ V; e% g
  4.      /* 设置字体 */   - H; {, S: Y& o' M9 G. _& r1 r2 K; z2 C
  5.      GUI_SetFont(&GUI_Font8x16);, {& a" H9 b# q$ i  e7 c, |
  6.      /* 设置背景颜色 */   4 J7 X: n3 ~% f8 z
  7.      GUI_SetBkColor(GUI_BLUE);
    " ?" X5 k7 B/ h0 A1 ^
  8.      GUI_Clear();      " k. {4 e) I3 c6 i1 L( }6 l. G# `
  9.      /* 设置画笔的粗细以及颜色,只有矢量函数才能设置Size */0 H; o  R. M% H
  10.      GUI_SetPenSize(10);   
    ; @0 D% ~# y8 w7 c, ^+ b6 ]% Y% ?
  11.      GUI_SetColor(GUI_RED);4 y/ d# J4 e. I: {" r! T7 I
  12.      GUI_DrawLine(80, 10, 240, 90);   
    9 \5 [% f: B1 }( J9 _& p4 [  g
  13.      GUI_DrawLine(80, 90, 240, 10);
    4 G" y! {" x5 k  q/ X8 r& n1 x
  14.      GUI_SetBkColor(GUI_BLACK);
    5 k. B: z3 m) u: x% E
  15.      GUI_SetColor(GUI_WHITE);      * s% _! V! b$ C( f
  16.      /* 设置正常模式 */
    - E2 |8 A. G6 ~+ Y1 B) o
  17.      GUI_SetTextMode(GUI_TM_NORMAL);  2 Y$ C: q& _& ?+ x% s9 F
  18.      GUI_DispStringHCenterAt("GUI_TM_NORMAL" , 160, 10);7 P/ o: J" \. C6 K1 L
  19.      /* 翻转文本 */   
    1 |& i0 l2 k/ g& i/ H8 J
  20.      GUI_SetTextMode(GUI_TM_REV);
      k( C8 M7 J! M2 _4 c# t' @: e7 i
  21.      GUI_DispStringHCenterAt("GUI_TM_REV" , 160, 26);        
    3 A! z$ z, A& b9 `0 z+ U
  22.      /* 透明文本 */
    : u, i# I7 i2 R, Z
  23.      GUI_SetTextMode(GUI_TM_TRANS);   9 t! X* w% {  @; Q) E
  24.      GUI_DispStringHCenterAt("GUI_TM_TRANS" , 160, 42);% z6 c0 j" I/ L9 N. _
  25.      /* 异或文本 */   2 l2 p/ y% H4 \( [+ W2 q2 W# l
  26.      GUI_SetTextMode(GUI_TM_XOR);
    $ S* K- Y$ l9 x
  27.      GUI_DispStringHCenterAt("GUI_TM_XOR" , 160, 58);   
    4 S1 _$ ~% k7 q: P6 i" g# @
  28.      /* 设置文本模式 */2 i6 e' `$ v6 D! R) }
  29.      GUI_SetTextMode(GUI_TM_TRANS | GUI_TM_REV);   ( R8 d1 l) J  O' D& p/ a( E
  30.      GUI_DispStringHCenterAt("GUI_TM_TRANS | GUI_TM_REV", 160, 74);
    1 D  @4 }9 l" w9 G7 J) f( ?/ a" u
  31.      while (1)   % c  }- a. E$ N; }- C# r
  32.      {4 l2 }0 A0 i+ I2 [
  33.          GUI_Delay(1000);   3 [; _8 F; T; n0 m* @8 v; P
  34.      }1 c: y& H, K( z7 `6 ]
  35. }
复制代码
    实际显示效果如下:
6.2.png
, w6 m" c9 C0 p. C) x9 h6 S# g" M
    关于文本设置方面还有一个函数这个里面还有一个函数GUI_SetTextStyle(),有兴趣的可以试试。
6.3.png
1 ~, n: }9 U( e$ b4 A
6.3  GUI_DispStringInRectWrap函数的使用
    先贴一下官方的使用说明
6.4.png
8 m: Y/ {5 `; c! Y! @. v3 T
    下面这个例子非常的好,很好的说明了三种模式的区别
  1. #include "GUI.h"
    . T$ v6 \1 f) d
  2. - q; d2 B6 T! a/ L0 j
  3. int i;
    4 f. e$ }, e9 l3 _) ^! ]' ^
  4. char acText[] = "This example demonstrates text wrapping";' }& h! J: e- i7 j; Q
  5. GUI_RECT Rect = {10, 10, 59, 59};' A& L9 A( ?3 S
  6. GUI_WRAPMODE aWm[] = {GUI_WRAPMODE_NONE,9 d$ ]  t2 ]  u( b. ~  V- B& k
  7.                       GUI_WRAPMODE_CHAR,% c2 l4 Q% E! h  g1 R
  8.                       GUI_WRAPMODE_WORD};
    / u1 ?7 d, H3 {
  9. void MainTask(void)
    % B' |5 A3 ^* n& H2 K2 i
  10. {
    ; ^2 e% P- |7 x2 N9 S
  11.     GUI_Init();
    & p* w. y6 S: H1 O" s. Q
  12.     GUI_SetTextMode(GUI_TM_TRANS);3 @3 _& @; z/ @+ L" f  N
  13.     for (i = 0; i < 3; i++)
    5 S) h! m+ U3 K5 I0 [
  14.     {
    ) f4 N4 D% p9 Z4 \  z: r
  15.         GUI_SetColor(GUI_BLUE);& A, ^& a% j! d% n4 m% v; P+ s# f
  16.         GUI_FillRectEx(&Rect);. f, Y4 X7 }3 Y
  17.         GUI_SetColor(GUI_WHITE);
    8 `& D& M) g3 P5 e
  18.         GUI_DispStringInRectWrap(acText, &Rect, GUI_TA_LEFT, aWm[i]);) O9 l! d2 e2 m: C1 K4 Q
  19.         Rect.x0 += 60;
    - {) _9 c3 a$ }7 T5 k
  20.         Rect.x1 += 60;$ k: F$ h( P& L
  21.     }
    + d! @( S4 h' ]( z* V+ o" r' l; J) j
  22.     while (1)+ J5 m% Y3 a% c/ O% ]
  23.     {
    & Q( @- k" K- P3 M5 c! t
  24.         GUI_Delay(10);0 X8 O- q1 ]2 d6 R
  25.     }* U' \3 V5 m9 }: Y  O
  26. }
复制代码
    实际显示效果如下:
6.5.png

: T& d" x5 W1 M' i; N9 I9 _: p8 t( p
" W( U9 T. A; |$ ?# s' s
. S, y0 Y% l+ m
收藏 评论1 发布时间:2015-1-10 13:40

举报

1个回答
baiyongbin2009 回答时间:2015-1-10 13:40:50
6.4  开发板上实现自动换行的例子
    下面是在开发板上面实现的自动换行例子:
  1. #include "GUI.h". F0 k! `! ?: w1 N' M" T, }

  2. 7 E( J8 Y9 s/ T8 g' u' ]; r# f- A
  3. int i;2 k' l& G9 h: i# _+ B2 E- _' p
  4. char acText[] = "www.armfly.com www.armfly.taobao.com Eric2013";
    , W! b. F+ a5 \1 G$ ]
  5. GUI_RECT Rect = {10, 10, 59, 59};; B+ N. _# C2 J* w, J6 e. C
  6. GUI_WRAPMODE aWm[] = {GUI_WRAPMODE_NONE,
    6 q5 i' u. G- k8 `' n
  7. GUI_WRAPMODE_CHAR,
    " V0 z  S# n2 n8 f( u, n0 A
  8. GUI_WRAPMODE_WORD};$ E$ N7 }: m) h( x2 G+ X* r& D
  9. /*4 ^* q/ ], j: S+ ?$ w
  10. *********************************************************************************************************" Y+ [2 f" E# N0 }
  11. * 函 数 名: MainTask
    6 t/ Z* R& d8 ?6 A7 b
  12. * 功能说明: GUI主函数" M$ A+ m: d5 v) P
  13. * 形 参:无% }/ U2 d9 k& F" Y" \; ]
  14. * 返 回 值: 无
    ; n* w" H2 [: V/ \! ^4 V
  15. *********************************************************************************************************& O8 L' O5 v' ^+ g" z' {3 u
  16. */! Z1 B. [: p4 ]+ H9 M3 |1 p6 i
  17. void MainTask(void)
    ) v, ~" k& g; G) U
  18. {
    , t  L- }, E9 X  d+ t6 w
  19. GUI_Init();# U8 F* d) W1 \  p8 o
  20. GUI_SetTextMode(GUI_TM_TRANS);
    9 n4 ]6 k8 h* Y
  21. for (i = 0; i < 3; i++)
      D& g5 i, @& ?; c
  22. {$ d7 x3 X: K) g4 ^# D1 W! w2 z; U
  23. GUI_SetColor(GUI_BLUE);( J# h: u# K9 F0 g" C1 C- M
  24. GUI_FillRectEx(&Rect);
    0 E0 `. i: M% T* k
  25. GUI_SetColor(GUI_WHITE);
    + ^, s! C. T  i3 y9 P# t
  26. GUI_DispStringInRectWrap(acText, &Rect, GUI_TA_LEFT, aWm[i]);
    ) [* s* P4 H( d7 Y1 j
  27. Rect.x0 += 60;& P7 \* f0 n7 L  M# F. c9 F( G
  28. Rect.x1 += 60;  R: k1 J, B- Y* ]; ]  w3 W
  29. }
    ! v8 q% H" `! b! |% {. T( ^$ K3 _/ X
  30. while (1)
    6 V3 I9 F  W  N6 _* `
  31. {. _0 [" D5 N! S- A; k8 w
  32. GUI_Delay(10);3 |- y/ O4 I- E1 z( n$ w  m& j
  33. }
    2 j" g& P" ^; q% x1 T
  34. }
复制代码
    将上面的代码复制到工程中的MainTask.c文件即可。
6.6.jpg
    实际显示效果如下:
6.7.png
6.5  总结
    文本的显示属于最基本的功能,初学者要多练练这些相关的函数,实践出真知。要不以后做一些复杂的例子,往往就是这些简单的地方出错。

3 T4 m! k. n- p' e

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版