特别说明:完整STemWin的1-60期教程和配套实例下载地址:链接
% k# ]; a2 U. P9 j0 q第18章 汉字显示方式一(FontCvt的使用)
" G* L9 h6 a( t( x7 C* _" X 本期教程主要跟大家介绍官方的小工具Font Converter的使用方法,使用官方的字体转换工具,字体的显示效果要比网上那些针对UCGUI设计的字体生成工具好非常多。4位抗锯齿的显示效果更是非常棒。在开头先跟大家强调两点,一个是这个字体小工具必须的使用STemWin软件包里面的,SEGGER官网下载的和MDK安装目录里面带的都是评估版,另一点是在教程中我会要求大家将要显示汉字的C文件转换为UTF-8编码,我仅仅是指的将这个显示汉字的C文件转换为UTF-8编码,这点要切记。 18. 1 使用FontCvt生成字库C文件的方法 18. 2 在开发板上面实现中文显示 18. 3 总结
8 e( v7 Z% a. Y1 D18.1 使用FontCvt生成字库C文件的方法 我们先讲如何用这个软件生成部分的汉字数据,这里就以“安富莱电子”五个字进行说明。 18.1.1 第一步:打开选择Standard,16bit unicode18.1.2 第二步:打开选择字体和字体大小18.1.3 第三步:选择禁止所有的字符18.1.4 第四步:用unicode软件转换函数 用中文转unicode的小软件得到“安富莱电子”这5个字的unicode编码我这里在百度上面找了一个网页应用。 18.1.5 第五步:在FontCvt上使能这个五个字的编码 在Font Converter软件上面使能这个五个字的unicode编码,以“安”字为例它的unicode编码是5b89,这里有两种办法找这个字。 方法一:直接的在软件里面查找,根据左边的unicode编码。 方法二:通过限制范围查找。
: l) S7 M6 p/ d; F( u3 _+ _18.1.6 第六步:然后点击保存为C文件 要将前面的五个字全部找到并使能以后再做保存。 18.2 在开发板上面实现中文显示 下面我们用18.1小节讲的汉字生成方式生成7中类型的字体。前三种是Standard的宋体,大小是16,36和72. 第四种是144*144点阵的,有没有这么大的字体,需要手动往大小选项里面填写144,并选择右侧的Pixels。 第五种选择4倍抗锯齿,144*144点阵宋体 第六种选择4倍抗锯齿,扩展比例模式,144*144点阵宋体 第七种选择4倍抗锯齿,扩展带边框模式,144*144点阵宋体 MDK工程中专门的建立一个文件用存储上面生成的汉字数据: 主运行函数还是方面MainTask.c文件里面,主程序如下: - #include "includes.h"
; N9 s, C d- r/ R! a( k - #include "MainTask.h"8 Z0 @" d5 B c7 l& q5 u
- 6 |% y5 `5 w* w" N5 M8 H8 h# k( X
- & [. m; ?; _6 ?" Y# I7 A. a! g' t
- extern GUI_CONST_STORAGE GUI_FONT GUI_FontSongFont36;(1)/ T& D% ?. P9 s# U6 ]3 M d
- extern GUI_CONST_STORAGE GUI_FONT GUI_FontSongFont;
& E+ u9 f. G; D - extern GUI_CONST_STORAGE GUI_FONT GUI_FontSongFont72;
( g- u- Z3 b. b2 R - extern GUI_CONST_STORAGE GUI_FONT GUI_FontSongFont144;
/ t. k- {1 t) \( Y0 T& r - extern GUI_CONST_STORAGE GUI_FONT GUI_FontSongFontA144;
, U2 [- x4 E3 S7 B* I - extern GUI_CONST_STORAGE GUI_FONT GUI_FontSongFontAEx144;
c0 D- C! v: E - extern GUI_CONST_STORAGE GUI_FONT GUI_FontSongFontAExF144;
k% x; f$ l5 N( V$ |. n( X* y - /** t$ t4 w4 t# E
- *********************************************************************************************************
, Z3 z! p5 y8 z! d g - * 创建对话框信息
* |5 \. A2 T+ k7 p1 l0 A - *********************************************************************************************************
* F& W2 Z1 P1 D" R - */- @0 @5 N3 W: K) X0 x( U8 [5 k8 e
- static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {% [: g* _7 x, ^4 S% E- J
- { FRAMEWIN_CreateIndirect, "armfly", 0, 0, 0, 800,480,FRAMEWIN_CF_MOVEABLE,0},- {" K# M) @- e7 `: d$ I$ O* e' D
- { BUTTON_CreateIndirect, "安富莱", GUI_ID_BUTTON0, 350,20,420,150,0,0},0 _; d7 [5 }, K$ T
- { TEXT_CreateIndirect, "安富莱电子", GUI_ID_TEXT0, 5, 10, 300, 33, 0,0},; I; z \. [: H( M; R1 ^
- { TEXT_CreateIndirect, "安富莱电子", GUI_ID_TEXT1, 5, 40,250, 50, 0,0},5 j0 ^- D" S5 \
- { TEXT_CreateIndirect, "安富莱", GUI_ID_TEXT2, 5, 100,360, 90, 0,0},- I' Q$ o1 C- l+ e* v6 n! x7 J
- { TEXT_CreateIndirect, "富", GUI_ID_TEXT3, 5, 220,144, 144, 0,0},
1 F- `/ X( }8 h: n/ _% s2 G, g - { TEXT_CreateIndirect, "富", GUI_ID_TEXT4, 205, 230,144, 144, 0,0},
; b& T. G8 U9 [# Q1 R - { TEXT_CreateIndirect, "富", GUI_ID_TEXT5, 405, 230,144, 144, 0,0},4 k# A* ]' M( x: |( i" g; E
- { TEXT_CreateIndirect, "富", GUI_ID_TEXT6, 605, 230,144, 144, 0,0}
F1 R& k: C _! H5 o - };
; ^1 h1 c8 e# E9 a - 2 O, F* \4 Y" T9 p$ E
- /*
4 G9 {; g* t; ^/ d - *********************************************************************************************************
( [0 U+ y' x6 a+ u - * 函 数 名: PaintDialog
. |: l- A5 Y I M - * 功能说明: 对话框重绘函数
. ?6 h: G# |, D' F F r4 O+ w1 u - * 形 参:pMsg 消息指针! y1 ]5 J% G. ?8 Y
- * 返 回 值: 无
7 A" a! ?: z. a; D - *********************************************************************************************************
/ r; q1 H$ A- M4 Z' \* V% C4 l - */
+ j s( L4 f+ m( |& p7 N - void PaintDialog(WM_MESSAGE * pMsg)
) M5 g7 N: D' q$ g- t Q- ^8 N& } - {
" e- ^2 E P! { i - WM_HWIN hWin = pMsg->hWin;
u, S; m! s) m" r9 d - }
. J7 d+ p. r8 B ^/ Y) ~, S. ] - ( M9 h& z$ s4 S( O4 S1 M
- /*: ~7 l. r" y7 W5 {, k, _; J
- *********************************************************************************************************, F" S& G: w. J$ H4 F4 |1 x
- * 函 数 名: 对话框初始化
& K; f# g# O* Y9 B" ]3 d - * 功能说明: 对话框初始化
4 M ~0 c& \& f! b6 F - * 形 参:pMsg 消息指针
( K. ~ k" L3 F* S: G - * 返 回 值: 无) X# F& a2 w R
- *********************************************************************************************************9 V) u2 b4 r# v8 u a" O
- */; A2 Q, Q" r T) X- L0 ?/ Y
- void InitDialog(WM_MESSAGE * pMsg)
- {% {* d4 |9 c3 _) u - {
( s# H/ p+ f, }; E' Y- a - WM_HWIN hWin = pMsg->hWin;8 W& }% Y4 m$ a0 A* a) P
- //! r0 `; d0 e& E' E9 I* J
- //FRAMEWIN
& e* p# x" G9 U( b3 Q - //1 q# \% {1 W7 b
- FRAMEWIN_SetFont(hWin,&GUI_Font32B_ASCII);0 o# `# F% E8 p( T* o
- FRAMEWIN_SetTextAlign(hWin,GUI_TA_VCENTER|GUI_TA_CENTER);! p) M) h3 C% F2 O
- FRAMEWIN_AddCloseButton(hWin, FRAMEWIN_BUTTON_RIGHT, 0);8 f' n! f- f( }* ~+ U
- FRAMEWIN_AddMaxButton(hWin, FRAMEWIN_BUTTON_RIGHT, 1);1 g' r2 s4 _- R( B2 a" W9 }' m9 A! _
- FRAMEWIN_AddMinButton(hWin, FRAMEWIN_BUTTON_RIGHT, 2);" n% j# O5 f+ S: X* G9 Q
- FRAMEWIN_SetTitleHeight(hWin,35); F7 F1 j& Q& O' k
- //& l* G* o3 D& b" h
- //GUI_ID_BUTTON0
0 @( L% b% c U' Z& }) H - //
( i9 ?. J' \0 m% k% m g! P' i - GUI_UC_SetEncodeUTF8();(2)/ U3 b. M5 B" @/ }
- BUTTON_SetFont(WM_GetDialogItem(hWin,GUI_ID_BUTTON0),&GUI_FontSongFontA144);(3)$ {! ^4 B3 [% P
- //* H9 t/ y, B! |0 d
- //GUI_ID_TEXT0: j- ^: N1 S w( o. o* I
- /// c4 i9 ]0 z l9 N
- TEXT_SetTextColor(WM_GetDialogItem(hWin,GUI_ID_TEXT0), GUI_RED);& K; U: f* Q1 m" c, v; j6 ]
- TEXT_SetFont(WM_GetDialogItem(hWin,GUI_ID_TEXT0),&GUI_FontSongFont);
! }, N) b: ~2 v - TEXT_SetTextColor(WM_GetDialogItem(hWin,GUI_ID_TEXT1), GUI_GREEN);. q, M6 ]& M. y6 _' W+ ^
- TEXT_SetFont(WM_GetDialogItem(hWin,GUI_ID_TEXT1),&GUI_FontSongFont36);
+ X" @) i3 w/ k0 f3 w X0 P - TEXT_SetTextColor(WM_GetDialogItem(hWin,GUI_ID_TEXT2), GUI_BLUE);
# Z" c; p2 Q/ P$ ] - TEXT_SetFont(WM_GetDialogItem(hWin,GUI_ID_TEXT2),&GUI_FontSongFont72);% h! D- U1 b$ Z5 y
- TEXT_SetFont(WM_GetDialogItem(hWin,GUI_ID_TEXT3),&GUI_FontSongFont144);+ p( g* d2 \3 ]' M: F7 k7 |: c
- TEXT_SetFont(WM_GetDialogItem(hWin,GUI_ID_TEXT4),&GUI_FontSongFontAEx144);, Q* S+ q, z: J
- TEXT_SetFont(WM_GetDialogItem(hWin,GUI_ID_TEXT5),&GUI_FontSongFontA144);" r! H# e* O' f6 z/ ?5 q
- TEXT_SetFont(WM_GetDialogItem(hWin,GUI_ID_TEXT6),&GUI_FontSongFontAExF144);
/ R. W7 J3 i% \2 ] - // GUI_UC_SetEncodeNone();
4 ^- ?9 J& p! R) L# C9 e3 s - }
1 w6 T/ |$ J5 n. ?# x- A a -
5 a) @& @7 ^2 [ v7 t$ ?/ w2 @$ D, P - /*7 J0 E7 L$ K% @2 R
- *********************************************************************************************************
8 @, i* ~# U# C; W! O - * 函 数 名: _cbCallback# A1 A+ a9 K M
- * 功能说明: 对话框回调函数
% M3 r+ O1 k, b* U - * 形 参:pMsg 消息指针. w( G0 y/ L" ]$ l5 v% `! C: g3 P0 @
- * 返 回 值: 无
5 K) s: e- h* N/ _ - *********************************************************************************************************
% e! x4 O6 {2 ]1 Q# q' Q( u - */. x7 K6 P! T" r& v" y3 V( Q
- static void _cbCallback(WM_MESSAGE * pMsg) 4 i% o& f, [- s, A `& n7 ?
- {4 h! r$ I o [4 I
- int NCode, Id;
- I: D+ N6 F6 Y# M. X3 y - WM_HWIN hWin = pMsg->hWin;1 z; Z9 \) B1 e0 q+ U. A8 H+ |# B
- switch (pMsg->MsgId)
% L1 L, t; S1 A, u - {( R# g5 N1 ]5 H7 \- h$ W: S
- case WM_PAINT:" Q" N* u6 M6 S# k! r/ h, h
- PaintDialog(pMsg);8 t e9 V. o2 V! s0 ?8 ^+ F
- break;
m8 A+ x" q* Q g2 y; v7 J2 c - case WM_INIT_DIALOG:& P8 R4 \6 \1 I7 w- u! N
- InitDialog(pMsg);1 b: P: W" B/ D. S' D1 I
- break;
7 |' z* e% y" k - case WM_KEY: N5 X! N- v9 Z- X8 |: o# e
- switch (((WM_KEY_INFO*)(pMsg->Data.p))->Key)
* _8 V4 B9 D" \ - {$ f$ R8 l% J* O j* N
- case GUI_KEY_ESCAPE:9 Z, E0 e+ g( y- A1 Y0 m8 `7 z
- GUI_EndDialog(hWin, 1);
: h6 v0 z `/ C) I( C - break;, o/ ^8 s# |+ D) f5 w
- case GUI_KEY_ENTER:
+ f: F2 N6 t' i8 |5 m I& c - GUI_EndDialog(hWin, 0);
: j4 H2 T; i7 W \: }, @ - break;
* N, _8 C# H) \1 R/ T9 }+ d - }( v' e9 R+ X0 g! U2 L5 Y+ H
- break; F$ a+ E& U) [" P/ M* P# W7 b
- case WM_NOTIFY_PARENT:
' z" V9 n3 @6 }+ ~1 z - Id = WM_GetId(pMsg->hWinSrc); / O) S0 d5 Q v! y9 w5 \
- NCode = pMsg->Data.v; 7 @7 ~: g, m3 t7 m5 n# f6 t
- switch (Id)
% ^' j* |1 V D* V2 e) m - {
9 @( Q0 m- Y; c. ` ]" I5 | - case GUI_ID_OK:& d5 S6 d" f l4 M2 }! B( P, n
- if(NCode==WM_NOTIFICATION_RELEASED)( w; ~1 S! k9 m8 p
- GUI_EndDialog(hWin, 0);
8 n$ ~* P7 [ A7 R! E - break;
# q0 s' a0 }" L& C - case GUI_ID_CANCEL:5 N1 q( @' C( V7 C9 d: L
- if(NCode==WM_NOTIFICATION_RELEASED): \5 u; V# D, ^4 t
- GUI_EndDialog(hWin, 0);
/ t' f" t$ r6 a# O! p$ C3 t! ?4 ^) W6 Z - break;
! R+ `$ w9 g \ F1 l - " _" s; _# \& E# {1 h, o1 G
- }
2 ]0 o/ q& b" L- ^ - break;
' p8 e% L' ]# G8 _ - default:
8 [/ X, O/ N- \9 V0 A - WM_DefaultProc(pMsg);$ ?! c6 b: ?: C/ h- n
- }
4 t. K4 Q7 O) E* A+ J - }, F% @* X; Y. ~* G% z& |
-
5 o% }, L/ w9 s3 A3 h - /*
; V; J; O! F; T. M5 ?; Z, A - *********************************************************************************************************
+ V1 D+ n# K5 Z& r, W) n - * 函 数 名: MainTask' u+ Y; M4 Q9 R2 I: q+ c
- * 功能说明: GUI主任务
8 p$ f8 P _" ]! l" a1 Z. c - * 形 参:无
+ a; E" K3 Q# F' y$ Y - * 返 回 值: 无4 g, \* u( r; S1 h
- *********************************************************************************************************
9 l! A. j. B! _5 c+ T( S E# R1 [ - */
0 h. b; o0 q2 j* M$ l q- S/ q - void MainTask(void)
" P0 A! x4 H6 ?( ?+ N2 A - { " w7 A: |2 @0 o: V
- GUI_Init();
- b7 C c# a$ u) \2 C1 I1 S6 @$ t - WM_SetDesktopColor(GUI_WHITE); /* Automacally update desktop window */1 a# u1 Y' r) t8 s9 {) a
- WM_SetCreateFlags(WM_CF_MEMDEV); /* Use memory devices on all windows to avoid flicker */
3 {9 A2 L6 G9 Y$ y/ { - PROGBAR_SetDefaultSkin(PROGBAR_SKIN_FLEX);( u( [3 ~! g% _1 x
- FRAMEWIN_SetDefaultSkin(FRAMEWIN_SKIN_FLEX);# D0 W# e, Z& Q; Q" E6 L0 a
- PROGBAR_SetDefaultSkin(PROGBAR_SKIN_FLEX);
" Y. G y+ c9 a - BUTTON_SetDefaultSkin(BUTTON_SKIN_FLEX);
! N1 i; p: l# C) P& S1 \" g/ T - CHECKBOX_SetDefaultSkin(CHECKBOX_SKIN_FLEX);
/ Z! V9 i- d9 ? - DROPDOWN_SetDefaultSkin(DROPDOWN_SKIN_FLEX);7 A& N( s! y2 Q& N% [6 a% z8 h
- SCROLLBAR_SetDefaultSkin(SCROLLBAR_SKIN_FLEX);; n" `8 @+ s; B
- SLIDER_SetDefaultSkin(SLIDER_SKIN_FLEX);( K4 C' ]+ S$ w* m2 ]9 ?
- HEADER_SetDefaultSkin(HEADER_SKIN_FLEX);8 [; F4 @9 k/ b# T
- RADIO_SetDefaultSkin(RADIO_SKIN_FLEX); o- d7 m1 E- Y4 _4 F, C
- GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), &_cbCallback, 0, 0, 0);
6 z# k- w1 n5 T2 B$ l ]+ M! A& E - while(1)
7 M: I# _, t9 f - {) _+ M. o& q1 H ]+ e6 z
- GUI_Delay(10);
% |( x+ i2 `( y1 j8 V, h% E2 P - }; V' @7 L& P# H3 d
- }
复制代码1. 通过extern声明要调用的字体。 2. 使能UTF-8解码格式。 3. 使用相关的汉字字体。 4. 运行程序前,一定要保证这个MainTask.c文件的编码格式是UTF-8。有时候经过复制粘贴,网络上传和下载等原因,编码格式不再是UTF-8了。修改编码格式的方法很简单: 实际显示效果如下,显示效果还是非常棒的,特别是抗锯齿字体。 特别注意,如果使用的是800*480分辨率的屏可以完成显示出来,如果是小于这个分辨率的屏只能显示出一部分,大家可以按照上面的设计方法做一个适合自己屏大小的显示或者直接拖动这个对话框即可。 18.3 使用FontCvt生成字库C文件的简单方法 前面18.1小节介绍的方面有点麻烦,这里介绍一种简单的方法。 18.3.1 第一步:建立txt文件,并写入汉字18.3.2 第二步:另存为unicode编码格式18.3.3 第三步:打开FontCvt软件并设置显示字体 18.3.4 第四步:选择禁止所有的字符18.3.5 第五步:读取前面的txt文件18.3.6 第六步:然后点击保存为C文件 通过这种方式生成的C文件就非常容易了。 18.4 总结 本期教程就为大家讲这么多,有兴趣的可以尝试一下其它字体的显示效果。如果大家使用的是IAR的话,现在IAR6.7及其以上的版本可以直接设置UTF-8编码,由于开发板配套的工程统一使用的是IAR6.3,但是IAR6.3按照本期教程的做法会出现乱码,所以没有提供IAR版本的工程代码。 0 m5 \1 q# V* ]5 b1 G: `8 B
|