特别说明:完整STemWin的1-60期教程和配套实例下载地址:链接6 }3 d' _7 c1 A2 l! E0 O
第21章 SIF系统独立字体(官方推荐) 6 `$ r, {3 ~5 N8 f' u
SIF字体和上章教程中讲的XBF字体基本是相同的,不同的是XBF是存储到外部存储器中,而SIF需要将其加载到内部存储器中,比如RAM里面,这样处理器就可以直接读取相应的地址就能获得数据。这种方式显示字体的速度要比XBF方式快。 21. 1 SIF格式字体生成方法 21. 2 移植到开发板显示 21. 3 总结 21.1 SIF格式字体生成方法 这里我们使用FontCvt生成一种宋体,字体选择16号并选standard模式。 21.1.1 第一步:选择standard21.1.2 第二步:选择字体和字体大小21.1.3 第三步:另存为SIF格式文件3 E" I/ U: A& q) X. ]% q
21.2 移植到开发板上显示 移植到开发上的程序主要分为两部分,一个是从SD卡中读取字体加载到外部SRAM里面,另一个建立一个对话框显示字体。 21.2.1 创建SIF字体- /*
! D- l c. m9 n' s - *********************************************************************************************************. g1 B" }$ k5 Y9 j+ _
- * 函 数 名: MainTask
: [( X* I K7 j: W+ F - * 功能说明: GUI主函数
1 K i$ C- k# e1 Z6 o8 `6 U - * 形 参:无( L8 x( n6 B$ T2 h5 l) I
- * 返 回 值: 无
& }- ?$ ]+ |. }0 ^ - *********************************************************************************************************
* K% z E; t n! ~ - */
, V7 p- O- X& {% Y - void MainTask(void)
; g; w0 B. R& b' q7 J - {( q- w2 t4 _1 N4 V4 e' u: g
- OS_ERR err;
/ k8 \6 M0 B$ M. }$ E - char *_acBuffer;
" q. n& G- p1 v- l6 i - _acBuffer = (char *)EXT_SRAM_ADDR; (1)
7 O5 E: J; |4 B# r - GUI_Init();, a8 n; k2 j' Y. T6 E5 l
- 5 k4 S8 ?" N4 R( c
- /* 打开文件 */- D# O6 a6 f2 X( }" D
- OSSchedLock(&err);(2)
* t. u) V( O. y' z5 q6 @ - result = f_open(&file, "son.sif", FA_OPEN_EXISTING | FA_READ | FA_OPEN_ALWAYS);
! L$ J$ v) k9 s5 T1 { - result = f_read(&file, _acBuffer, file.fsize, &bw);(3)7 z8 q0 v* a; w' y
- OSSchedUnlock(&err); 7 \' S- ]" w* P. Q4 l# c
- GUI_SIF_CreateFont(_acBuffer, &SIF_Font, GUI_SIF_TYPE_PROP);(4)
/ l% Y% J; g! R* g, k - WM_SetDesktopColor(GUI_WHITE); 9 R9 [ _" W- [, V
- WM_SetCreateFlags(WM_CF_MEMDEV);
! u& A# _" e; S. F2 E2 P- @ - PROGBAR_SetDefaultSkin(PROGBAR_SKIN_FLEX);4 T0 u+ g$ w2 G( H
- FRAMEWIN_SetDefaultSkin(FRAMEWIN_SKIN_FLEX);
, ~& p! ~2 n3 O: H - PROGBAR_SetDefaultSkin(PROGBAR_SKIN_FLEX);
% R$ o t5 j h5 l& A& P# F# B. H9 q - BUTTON_SetDefaultSkin(BUTTON_SKIN_FLEX);% N2 b: V4 ~. L& Q* V
- CHECKBOX_SetDefaultSkin(CHECKBOX_SKIN_FLEX);) J) b% O+ T6 \7 K! }0 C/ y
- DROPDOWN_SetDefaultSkin(DROPDOWN_SKIN_FLEX);# W# c+ U9 f; U y4 g
- SCROLLBAR_SetDefaultSkin(SCROLLBAR_SKIN_FLEX);: {* q6 N0 l9 ~' N* p2 @. K
- SLIDER_SetDefaultSkin(SLIDER_SKIN_FLEX);
) J0 {; J0 K( C. h; \% a - HEADER_SetDefaultSkin(HEADER_SKIN_FLEX);/ ?9 ^, G$ e$ M. s' h6 I0 d
- RADIO_SetDefaultSkin(RADIO_SKIN_FLEX);
8 h( ^. N/ ?# ?- |# P7 p7 [ - GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), &_cbCallback, 0, 0, 0);
9 t0 Y5 A, h9 X& q3 W' H - while(1)9 i+ @! {7 I4 Q* I, g
- {
' T1 ^& d+ x' |. ^1 V8 z! J - GUI_Delay(100);
! t! j4 D1 B2 q" G% m! N6 o6 ~8 ~ - }
" C: N* n1 t# Z& Y' ~5 d - 4 Z6 @/ n, q& u
- }
复制代码1. 指针变量指向外部SRAM首地址。 2. 加上调度锁,防止从SD卡中加载数据到SRAM时出错 3. 从SD卡中加载数据到外部SRAM中。 4. 创建SIF字体 21.2.2 主函数- GUI_FONT SIF_Font;. U9 P9 |5 u+ j& F& h/ w
- /*( f+ } V; o& ~+ G5 g, X( g# M3 x
- *********************************************************************************************************, l& b( }0 `6 j- C0 {7 a
- * 对话框信息
$ H# m: F! i, l* t/ Y' @, q - *********************************************************************************************************: x6 V* P, p% `- x" P7 m
- */
* w: M- w3 R' Y1 T& H - static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {
6 x5 q2 ~$ T. z- ^6 T" p" z - { FRAMEWIN_CreateIndirect, "安富莱电子论坛欢迎大家", 0, 0, 0, 800,480,FRAMEWIN_CF_MOVEABLE,0},! R: ?' L. S; q0 ~+ i: a* l
- { BUTTON_CreateIndirect, "安富莱电子www.armfly.com", GUI_ID_BUTTON0, 390,40,360,100,0,0},
! X0 i. d* n% Z- a# O; ? - { TEXT_CreateIndirect, "安富莱电子www.armfly.com", GUI_ID_TEXT0, 5, 10, 300, 40, 0,0},' o/ F; }' \1 Q
- { TEXT_CreateIndirect, "安富莱电子www.armfly.com", GUI_ID_TEXT1, 5, 50,300, 40, 0,0},
% J, W9 t. @. e/ d - { TEXT_CreateIndirect, "安富莱电子www.armfly.com", GUI_ID_TEXT2, 5, 90,300, 40, 0,0},, M% ?$ E; k1 {- X, M% C
- { TEXT_CreateIndirect, "安富莱电子www。armfly。com", GUI_ID_TEXT3, 5, 159,500, 40, 0,0}4 Z( C7 I% y8 y% s% P8 M
- }; s- K9 y$ ~. _: U6 t) {- E
- $ K6 C# O' r' q7 C8 L
- /*2 V7 y6 ~5 \6 y. I6 J+ |
- *********************************************************************************************************. W2 b9 ]( h3 M
- * 函 数 名: PaintDialog
4 n2 w6 {( ~2 M0 c; ^( K - * 功能说明: 重绘函数 E7 M( Z6 f/ G- U6 U3 O: W
- * 形 参:pMsg 消息指针
2 p V! c" d5 r! A; T! J - * 返 回 值: 无
/ c2 d; {( t2 ~5 P* @ - *********************************************************************************************************8 O$ r: I- H& ]3 U- b
- */7 t3 ?! G7 L+ k% s% T2 H" D
- void PaintDialog(WM_MESSAGE * pMsg)& P2 L, z" i+ V
- {
5 ]- X( }: p0 s - WM_HWIN hWin = pMsg->hWin;1 q* G# D% G4 T3 X
- }
* S( `! S4 ^' C0 H - $ `4 ]- ?2 l. f6 l1 z/ G5 Q
- /*2 w x: w/ V% l% F2 c
- *********************************************************************************************************
( v& U6 |1 N; w. | - * 函 数 名: InitDialog
1 Y0 i; j, l0 U8 ` - * 功能说明: 对话框初始化
! O7 s4 R- I& O6 m - * 形 参:pMsg 消息指针) ]; z+ X4 a7 b2 G4 _: _" ^% W
- * 返 回 值: 无
$ N; @9 H' F. D( i' ~1 C: x# f - *********************************************************************************************************
9 I, @4 ?) A: y' b/ D: C - */
& y) A& d5 b$ D9 ~7 j; I - void InitDialog(WM_MESSAGE * pMsg); ?2 T& s' t' Y5 Y. a# l
- {
7 s0 m, z/ B: F - WM_HWIN hWin = pMsg->hWin;% X; ~4 n# x. t$ N# U; B; M1 _
- //8 W4 @* u7 e5 b7 k0 s6 m
- //FRAMEWIN0 Y/ D1 r) X9 U* A# y5 e2 M
- // V5 ^: V5 m' P2 \) }8 S
- FRAMEWIN_SetFont(hWin,&SIF_Font);5 i$ f1 ~) S* f# p0 u( g% G
- FRAMEWIN_SetTextAlign(hWin,GUI_TA_VCENTER|GUI_TA_CENTER);6 s1 `& M# r2 W- C, R& s9 ~
- FRAMEWIN_AddCloseButton(hWin, FRAMEWIN_BUTTON_RIGHT, 0);
" m- t5 {% G' X8 J0 H - FRAMEWIN_AddMaxButton(hWin, FRAMEWIN_BUTTON_RIGHT, 1);9 e/ B2 w" M" W6 x1 A, z
- FRAMEWIN_AddMinButton(hWin, FRAMEWIN_BUTTON_RIGHT, 2);7 Q: W" y/ {: m1 Y; K6 W5 Z
- FRAMEWIN_SetTitleHeight(hWin,35);; M0 I+ Z+ S4 Q6 L3 J9 g
- //3 Q6 T! {1 {0 X; e8 t5 w
- //GUI_ID_BUTTON0* I, b% V: G" c. X
- //
) j( ]* D: L* z0 Z; M# m$ P - GUI_UC_SetEncodeUTF8(); (1)
9 S R4 n+ V# \8 c9 U @ - BUTTON_SetFont(WM_GetDialogItem(hWin,GUI_ID_BUTTON0),&SIF_Font);(2)
3 P8 t, r$ a8 }( b* B! g: ` - //
+ z. `# J4 T, }8 \; S - //GUI_ID_TEXT0
9 `+ O/ Z# v u7 _4 | - // t% n }$ D8 m- G
- TEXT_SetTextColor(WM_GetDialogItem(hWin,GUI_ID_TEXT0), GUI_RED);
, v( Z" K' S" z4 b# _( X/ N1 h3 U0 M. z - TEXT_SetFont(WM_GetDialogItem(hWin,GUI_ID_TEXT0),&SIF_Font);
# J+ H6 |4 d1 H$ a7 Z# n0 U) } - TEXT_SetTextColor(WM_GetDialogItem(hWin,GUI_ID_TEXT1), GUI_GREEN);# g+ k% @: G0 |- K
- TEXT_SetFont(WM_GetDialogItem(hWin,GUI_ID_TEXT1),&SIF_Font);" c& d% z( U( Z) A
- TEXT_SetTextColor(WM_GetDialogItem(hWin,GUI_ID_TEXT2), GUI_BLUE);
( F# R1 s/ b. k# f2 a( w2 y& ^& v) ` - TEXT_SetFont(WM_GetDialogItem(hWin,GUI_ID_TEXT2),&SIF_Font);+ g! A- p, A3 N- s4 I' w {9 J$ o
- TEXT_SetTextColor(WM_GetDialogItem(hWin,GUI_ID_TEXT2), GUI_YELLOW);
! D" D: C* A k' A8 [ - TEXT_SetFont(WM_GetDialogItem(hWin,GUI_ID_TEXT3),&SIF_Font);
: n3 x( o1 j5 `* k7 R0 Y8 [6 W - // GUI_UC_SetEncodeNone();4 N' a$ M6 o, _2 X$ `
- }8 Z$ [7 Y/ ]* }# A3 f! K- E
- / k! b! X3 ~( v, @) ?
- /*
0 [: T( n3 Y/ ^& w+ u - *********************************************************************************************************
! R; K4 ]8 b x - * 函 数 名: _cbCallback
: s, _% e9 e3 Z - * 功能说明: 对话框回调函数
, H+ c& ~5 A) ] - * 形 参:无1 K$ A0 p5 m0 ^3 \
- * 返 回 值: 无
, V! z7 W, k: ~3 q - *********************************************************************************************************
& i1 N. H* ^/ C( [ - */, s5 Z. p3 Q. Y
- static void _cbCallback(WM_MESSAGE * pMsg) % D- z# _2 a2 d4 `) K q9 E a
- {+ W: d- P& C! {5 @
- int NCode, Id;
. L* J" c( k% K0 Y+ W3 z3 n" b - WM_HWIN hWin = pMsg->hWin;
% ?$ E2 a) f! A - switch (pMsg->MsgId)
+ W# i5 \3 e+ Q! B) _, s - {8 m/ t" {4 W2 a
- case WM_PAINT:/ Q. J1 c! }3 s" j3 W/ E/ M
- PaintDialog(pMsg);
6 f* \- x. {* F) G8 Y) e% R: \; K - break;
- h2 y9 i9 X- s) Z& m - case WM_INIT_DIALOG:
4 M$ C/ ?' p) m0 I# U0 J - InitDialog(pMsg);
t+ d/ t7 \" _% y( D% M2 } - break;
+ S0 K9 R; c. r7 N - case WM_KEY:5 X+ t R, {3 |5 p. G
- switch (((WM_KEY_INFO*)(pMsg->Data.p))->Key) 6 k: S( F: I% V% ^9 `: h t! g
- {. [# W, t, B" ?- S6 N* C2 j
- case GUI_KEY_ESCAPE:
$ k$ G/ W. ?3 q: v. y6 U5 U, p - GUI_EndDialog(hWin, 1);
- x9 w9 \. L2 B3 H0 O" X2 P# @, g - break;8 l- }) d/ z" P. S: g
- case GUI_KEY_ENTER:
2 G L4 R/ ^4 \! f2 A3 R - GUI_EndDialog(hWin, 0);( F7 D; F5 l. ?1 l9 S0 e! {+ N
- break;* c& G6 g4 }: s
- }7 m/ N+ u+ ~3 T z% ~: E
- break;
6 U5 f0 n8 Z$ M. a: |; p& r - case WM_NOTIFY_PARENT:: f4 @# D# _9 X: @
- Id = WM_GetId(pMsg->hWinSrc);
/ g$ i! w) u @ - NCode = pMsg->Data.v; % `- R' g" e9 x
- switch (Id)
8 A$ _3 q; e, a2 Y* H9 K - {
. \5 [1 A$ `2 ^; d u' S0 _ - case GUI_ID_OK:
A: \+ x6 @! H. M$ n9 Z - if(NCode==WM_NOTIFICATION_RELEASED)! w; K( K0 C4 r8 V8 g& m/ ]
- GUI_EndDialog(hWin, 0);
w# q6 v( y9 w! n- F0 E - break;, z2 P9 Y. A k! j+ |* O
- case GUI_ID_CANCEL:
+ a/ @& x3 u \! E% r+ |$ m - if(NCode==WM_NOTIFICATION_RELEASED)
+ R$ o& X* r( v E8 a1 \ - GUI_EndDialog(hWin, 0);$ Q5 z6 o+ @! T: L' ]& k% k
- break;! I x: [" I% Z" U; e) v) {- e
-
$ a3 _0 L) D# W/ q - }$ \- b8 x! R/ l z( t7 Y) Q$ o2 ]/ N' {, G
- break;) |; I6 U( ]; O; @+ b0 R' k
- default:
7 G8 c. Y; E7 g* O5 F5 ^* ]& s - WM_DefaultProc(pMsg);& x0 k2 t$ ]# E2 Q9 J
- }
9 L. N* g) k. l7 \0 l* m5 { - }
复制代码1. 使能UTF-8解码。 2. 使用SIF字体,其它控件类似。 3. 特别注意这个程序是在MainTask.c文件里面实现的,这个文件的编码格式必须得是UTF-8,设置方法看前面18.1.6小节。 实际显示效果如下: 特别注意,如果使用的是800*480分辨率的屏可以完成显示出来,如果是小于这个分辨率的屏只能显示出一部分,大家可以按照上面的设计方法做一个适合自己屏大小的显示或者直接拖动这个对话框即可。 21.3 总结 SIF字体适合用在有大容量的SRAM或者SDRAM中,显示速度当然也快很多。
/ q$ L2 D+ P7 z% [ |