本帖最后由 baiyongbin2009 于 2015-1-10 13:42 编辑 " O L5 H3 L) p0 E, b3 I1 C1 F; a5 O8 ~
, v& o4 f7 X0 P. a" r特别说明:完整STemWin的1-60期教程和配套实例下载地址:链接 第6章 STemWin文本显示 ; X/ L; ]( z8 }+ c- r/ `/ S
本期主要讲文本的显示,整体来说比较的简单,但很适合初学者看,有些文本函数在使用上要特别注意,教程中会给大家详细的讲解。 6. 1 简单文本显示 6. 2 文本绘制模式 6. 3 GUI_DispStringInRectWrap函数的使用 6. 4 开发板上面实现自动换行的例子 6. 5 总结
' Q% M" ~5 O$ o0 ]$ |) J$ ]6.1 简单文本显示 讲解简单的文本显示前得说下控制字符,因为在使用STemwin来做一个文本阅读器时,了解这个很重要。控制字符是指字符代码小于32的字符。控制字符被定义为ASCII代码的一部分。emWin忽略了下表所列字符以外的所有控制字符: | | | | | LF | \n | 换行。 当前文本位置改变至下一行的开始。默认为:X = 0。 Y + =字体-距离 (单位:像素)(如例程GUI_GetFontDistY()计算得出) | | | | 回车。 当前文本位置改变至当前行的开始。默认为:X = 0。 |
控制字符LF的用法在字符串中非常方便。换行符可以作为字符串的一部分,这样,字符串就可以拆分为多行,且只需调用一个例程就能显示。 下面在emWin5.24的模拟器上面实现一下,下面的这个程序,主要是通过\n实现换行,模拟器的使用方法,看前面几期就会了。 - void MainTask(void)
1 }3 u0 n1 k$ R/ O* k* U0 a - { 3 ]3 p( q& P6 }: \$ ]$ |
- GUI_Init();(1)2 Q2 ? w$ Q! |9 W
- /* 对于初学者,这个地方一定要注意,这里只是设置背景颜色,也就是给变量赋值了一下 */ 8 |8 C: D6 y. \8 t8 ~! D. H# U
- GUI_SetBkColor(GUI_BLUE);
+ n, y, ]+ D/ j) C - /* 要实现背景颜色的改变,必须的执行下面这句 */ : [) w0 t) i {) c
- GUI_Clear();( u5 b( n! y3 M9 m3 U2 Y5 F$ g
- GUI_SetFont(&GUI_Font8x16);
9 k4 t$ o* w2 P/ C W - /* 这里调用字符串显示 并实现一下换行 */ J4 t$ U* l2 c5 H
- GUI_DispString("www.armfly.com \navailable"); % V4 G9 f& Z; B8 o- g
-
, G# V9 D% S# C! e( @1 f' I - while (1)# j8 M6 k, }- E
- { 7 u* _1 X/ Z& f4 _4 |- S
- GUI_Delay(1000);(2)
' a6 u+ S/ S' c/ D: e - }: W+ ?: a* o" Q7 L9 P' v1 i/ X1 ~
- }
复制代码1. 使用STemWin函数前,初始化一定要有。 2. 这里不仅仅是个延迟函数,窗口的刷新等功能最终是由这个函数实现的。 实际显示效果如下: 6 R0 ~. d7 c- z$ s: I) k9 N" r
函数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。 - void MainTask(void)
, z" n+ D) C$ h - { 5 O& C" E. u# v
- GUI_Init();& ~/ e) Z) z- v, c- u7 S& ~' u7 m
- /* 设置字体 */ 3 I0 {1 l; @6 N1 x* d
- GUI_SetFont(&GUI_Font8x16);% l0 X! Z, @. p% y, x# f
- /* 设置背景颜色 */ ) W# T1 J3 P( [& ?4 E
- GUI_SetBkColor(GUI_BLUE);
4 g6 i* b8 w' U- C! q5 E0 c, {8 U! E - GUI_Clear();
3 q+ v: y, y# M1 \ - /* 设置画笔的粗细以及颜色,只有矢量函数才能设置Size */3 |9 V ~9 `) l: O. k( O
- GUI_SetPenSize(10); 9 E' x$ P4 s6 v/ t; ]2 @
- GUI_SetColor(GUI_RED);- _# b3 T0 f0 G; Y& U4 b
- GUI_DrawLine(80, 10, 240, 90);
$ c; l. n1 v& I# P' A2 l: n - GUI_DrawLine(80, 90, 240, 10);
; u# ^+ ?9 A _ - GUI_SetBkColor(GUI_BLACK);
) u. R# n2 y; h; x3 t( k$ @ T% ] - GUI_SetColor(GUI_WHITE); # g6 O% q: I% `7 m) {# t
- /* 设置正常模式 */
4 M6 U# Y+ q% w' e$ v - GUI_SetTextMode(GUI_TM_NORMAL);
4 k2 \- i# z& d& m; H2 I, K - GUI_DispStringHCenterAt("GUI_TM_NORMAL" , 160, 10);
, B( L+ k+ R# G6 p - /* 翻转文本 */
4 O& \# [8 D3 k7 w1 S - GUI_SetTextMode(GUI_TM_REV);! |$ d* |% A: V. k
- GUI_DispStringHCenterAt("GUI_TM_REV" , 160, 26); & I4 u. u3 V' v& P
- /* 透明文本 */' X5 T8 h3 {, u
- GUI_SetTextMode(GUI_TM_TRANS); . F; _9 ^: F4 C8 S/ r) i
- GUI_DispStringHCenterAt("GUI_TM_TRANS" , 160, 42); [; Q" T3 c d: y: t2 D
- /* 异或文本 */ ) p7 J; ]/ d9 p' j4 V( I
- GUI_SetTextMode(GUI_TM_XOR);
) n1 I8 }4 E2 F - GUI_DispStringHCenterAt("GUI_TM_XOR" , 160, 58); ; g8 T9 M9 ~% c: W- |
- /* 设置文本模式 */; a+ U, t( P/ U7 C* E6 C
- GUI_SetTextMode(GUI_TM_TRANS | GUI_TM_REV);
3 N* X. l3 e$ N- ~; U, o$ D - GUI_DispStringHCenterAt("GUI_TM_TRANS | GUI_TM_REV", 160, 74);
$ a% Y. o! w/ B6 O# i - while (1)
) m: s7 g' d, R0 A' T6 T - {2 m1 U/ Z6 K T, n x6 ?$ D3 r
- GUI_Delay(1000);
+ _3 l: p1 a& h2 |1 ^ C* A - }$ e6 i F% G$ G, ~. v' S
- }
复制代码 实际显示效果如下:
) N* a. P* w: N6 y: K n( C 关于文本设置方面还有一个函数这个里面还有一个函数GUI_SetTextStyle(),有兴趣的可以试试。 0 P( R$ V. L' }$ g! a7 D8 y* b
6.3 GUI_DispStringInRectWrap函数的使用 先贴一下官方的使用说明
8 W! k' A0 j0 _5 N% [ M 下面这个例子非常的好,很好的说明了三种模式的区别 - #include "GUI.h"
) ?& Z# k/ V s k& e - ; o1 e% z7 K3 T+ l/ A
- int i;1 t" x9 Q; j8 ^6 L
- char acText[] = "This example demonstrates text wrapping";- ]* @' C" u5 D( e" c7 G
- GUI_RECT Rect = {10, 10, 59, 59};
% |- T, @/ k( X2 W4 o3 T. L3 C5 \0 i( ^ - GUI_WRAPMODE aWm[] = {GUI_WRAPMODE_NONE,
; |4 \0 n/ q; [3 W" w$ W. B - GUI_WRAPMODE_CHAR,
* L) A( B% n0 b0 Z4 H5 Z3 G - GUI_WRAPMODE_WORD};( U6 g+ w5 S+ R0 F) A1 X
- void MainTask(void)
1 E2 _7 _- ^. Z" x2 z- G9 v - {& M7 W( E. h' F- C9 r
- GUI_Init();0 U% e1 }; J+ \
- GUI_SetTextMode(GUI_TM_TRANS);
3 [# O2 l- G/ Z- O - for (i = 0; i < 3; i++)1 h) q$ S' t W/ c! N5 y& h
- {
# X5 D# W x+ x9 \, ?$ _; X - GUI_SetColor(GUI_BLUE);# ~( w* l4 Y, l) Z& I
- GUI_FillRectEx(&Rect);6 L: V _) b2 ~4 e! ~4 ^1 G
- GUI_SetColor(GUI_WHITE);
8 Z1 b! ~4 l- W& ?, _2 q# b+ O) m - GUI_DispStringInRectWrap(acText, &Rect, GUI_TA_LEFT, aWm[i]);8 F9 W0 V5 o m: S7 r+ l0 r- ~
- Rect.x0 += 60;, B: w' {7 o! |9 _( {1 T, j3 V
- Rect.x1 += 60;: Z9 } R/ r6 d+ b o: o& Z: U
- }2 N( b6 U) T- q# H
- while (1)
9 q: W# i7 S" ~$ M) ^ - {
$ Y0 ~2 q* n# I" B& | - GUI_Delay(10);* \( _0 M0 Q& t
- }
2 D1 L5 p8 n* w/ N2 _9 E1 E8 k1 K - }
复制代码 实际显示效果如下: 1 @" b% d: g+ k( Q7 d5 g0 \ m7 S
4 j) [9 f# d8 ?
4 O7 Y0 s9 A" D6 j/ [3 z- K6 Y. X7 s' @( `3 o Z
|