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