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

【安富莱STemWin教程】第21章 SIF系统独立字体(官方推荐)

[复制链接]
baiyongbin2009 发布时间:2015-1-31 11:17
特别说明:完整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 第一步:选择standard
21.1.png
21.1.2 第二步:选择字体和字体大小
21.2.png
21.1.3 第三步:另存为SIF格式文件
21.3.png
21.4.png
3 E" I/ U: A& q) X. ]% q
21.2 移植到开发板上显示
    移植到开发上的程序主要分为两部分,一个是从SD卡中读取字体加载到外部SRAM里面,另一个建立一个对话框显示字体。
21.2.1 创建SIF字体
  1. /*
    ! D- l  c. m9 n' s
  2. *********************************************************************************************************. g1 B" }$ k5 Y9 j+ _
  3. *        函 数 名: MainTask
    : [( X* I  K7 j: W+ F
  4. *        功能说明: GUI主函数
    1 K  i$ C- k# e1 Z6 o8 `6 U
  5. *        形    参:无( L8 x( n6 B$ T2 h5 l) I
  6. *        返 回 值: 无
    & }- ?$ ]+ |. }0 ^
  7. *********************************************************************************************************
    * K% z  E; t  n! ~
  8. */
    , V7 p- O- X& {% Y
  9. void MainTask(void)
    ; g; w0 B. R& b' q7 J
  10. {( q- w2 t4 _1 N4 V4 e' u: g
  11. OS_ERR              err;
    / k8 \6 M0 B$ M. }$ E
  12. char *_acBuffer;
    " q. n& G- p1 v- l6 i
  13. _acBuffer = (char *)EXT_SRAM_ADDR; (1)
    7 O5 E: J; |4 B# r
  14. GUI_Init();, a8 n; k2 j' Y. T6 E5 l
  15. 5 k4 S8 ?" N4 R( c
  16. /* 打开文件 */- D# O6 a6 f2 X( }" D
  17. OSSchedLock(&err);(2)
    * t. u) V( O. y' z5 q6 @
  18. result = f_open(&file, "son.sif", FA_OPEN_EXISTING | FA_READ | FA_OPEN_ALWAYS);
    ! L$ J$ v) k9 s5 T1 {
  19. result = f_read(&file, _acBuffer, file.fsize, &bw);(3)7 z8 q0 v* a; w' y
  20. OSSchedUnlock(&err); 7 \' S- ]" w* P. Q4 l# c
  21. GUI_SIF_CreateFont(_acBuffer, &SIF_Font, GUI_SIF_TYPE_PROP);(4)
    / l% Y% J; g! R* g, k
  22. WM_SetDesktopColor(GUI_WHITE);       9 R9 [  _" W- [, V
  23. WM_SetCreateFlags(WM_CF_MEMDEV);   
    ! u& A# _" e; S. F2 E2 P- @
  24. PROGBAR_SetDefaultSkin(PROGBAR_SKIN_FLEX);4 T0 u+ g$ w2 G( H
  25. FRAMEWIN_SetDefaultSkin(FRAMEWIN_SKIN_FLEX);
    , ~& p! ~2 n3 O: H
  26. PROGBAR_SetDefaultSkin(PROGBAR_SKIN_FLEX);
    % R$ o  t5 j  h5 l& A& P# F# B. H9 q
  27. BUTTON_SetDefaultSkin(BUTTON_SKIN_FLEX);% N2 b: V4 ~. L& Q* V
  28. CHECKBOX_SetDefaultSkin(CHECKBOX_SKIN_FLEX);) J) b% O+ T6 \7 K! }0 C/ y
  29. DROPDOWN_SetDefaultSkin(DROPDOWN_SKIN_FLEX);# W# c+ U9 f; U  y4 g
  30. SCROLLBAR_SetDefaultSkin(SCROLLBAR_SKIN_FLEX);: {* q6 N0 l9 ~' N* p2 @. K
  31. SLIDER_SetDefaultSkin(SLIDER_SKIN_FLEX);
    ) J0 {; J0 K( C. h; \% a
  32. HEADER_SetDefaultSkin(HEADER_SKIN_FLEX);/ ?9 ^, G$ e$ M. s' h6 I0 d
  33. RADIO_SetDefaultSkin(RADIO_SKIN_FLEX);
    8 h( ^. N/ ?# ?- |# P7 p7 [
  34.     GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), &_cbCallback, 0, 0, 0);
    9 t0 Y5 A, h9 X& q3 W' H
  35. while(1)9 i+ @! {7 I4 Q* I, g
  36. {
    ' T1 ^& d+ x' |. ^1 V8 z! J
  37. GUI_Delay(100);
    ! t! j4 D1 B2 q" G% m! N6 o6 ~8 ~
  38. }
    " C: N* n1 t# Z& Y' ~5 d
  39. 4 Z6 @/ n, q& u
  40. }
复制代码
1. 指针变量指向外部SRAM首地址。
2. 加上调度锁,防止从SD卡中加载数据到SRAM时出错
3. 从SD卡中加载数据到外部SRAM中。
4. 创建SIF字体
21.2.2 主函数
  1. GUI_FONT SIF_Font;. U9 P9 |5 u+ j& F& h/ w
  2. /*( f+ }  V; o& ~+ G5 g, X( g# M3 x
  3. *********************************************************************************************************, l& b( }0 `6 j- C0 {7 a
  4. *                  对话框信息
    $ H# m: F! i, l* t/ Y' @, q
  5. *********************************************************************************************************: x6 V* P, p% `- x" P7 m
  6. */
    * w: M- w3 R' Y1 T& H
  7. static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {
    6 x5 q2 ~$ T. z- ^6 T" p" z
  8.     { FRAMEWIN_CreateIndirect,  "安富莱电子论坛欢迎大家",     0,                       0,  0,  800,480,FRAMEWIN_CF_MOVEABLE,0},! R: ?' L. S; q0 ~+ i: a* l
  9.     { BUTTON_CreateIndirect,    "安富莱电子www.armfly.com",                    GUI_ID_BUTTON0,          390,40,360,100,0,0},
    ! X0 i. d* n% Z- a# O; ?
  10.     { TEXT_CreateIndirect,      "安富莱电子www.armfly.com",                    GUI_ID_TEXT0,            5, 10, 300, 40, 0,0},' o/ F; }' \1 Q
  11.     { TEXT_CreateIndirect,      "安富莱电子www.armfly.com",                    GUI_ID_TEXT1,            5, 50,300, 40, 0,0},
    % J, W9 t. @. e/ d
  12.     { TEXT_CreateIndirect,      "安富莱电子www.armfly.com",                    GUI_ID_TEXT2,            5, 90,300, 40, 0,0},, M% ?$ E; k1 {- X, M% C
  13. { TEXT_CreateIndirect,     "安富莱电子www。armfly。com",      GUI_ID_TEXT3,            5, 159,500, 40, 0,0}4 Z( C7 I% y8 y% s% P8 M
  14. };  s- K9 y$ ~. _: U6 t) {- E
  15. $ K6 C# O' r' q7 C8 L
  16. /*2 V7 y6 ~5 \6 y. I6 J+ |
  17. *********************************************************************************************************. W2 b9 ]( h3 M
  18. *        函 数 名: PaintDialog
    4 n2 w6 {( ~2 M0 c; ^( K
  19. *        功能说明: 重绘函数  E7 M( Z6 f/ G- U6 U3 O: W
  20. *        形    参:pMsg 消息指针
    2 p  V! c" d5 r! A; T! J
  21. *        返 回 值: 无
    / c2 d; {( t2 ~5 P* @
  22. *********************************************************************************************************8 O$ r: I- H& ]3 U- b
  23. */7 t3 ?! G7 L+ k% s% T2 H" D
  24. void PaintDialog(WM_MESSAGE * pMsg)& P2 L, z" i+ V
  25. {
    5 ]- X( }: p0 s
  26.     WM_HWIN hWin = pMsg->hWin;1 q* G# D% G4 T3 X
  27. }
    * S( `! S4 ^' C0 H
  28. $ `4 ]- ?2 l. f6 l1 z/ G5 Q
  29. /*2 w  x: w/ V% l% F2 c
  30. *********************************************************************************************************
    ( v& U6 |1 N; w. |
  31. *        函 数 名: InitDialog
    1 Y0 i; j, l0 U8 `
  32. *        功能说明: 对话框初始化
    ! O7 s4 R- I& O6 m
  33. *        形    参:pMsg 消息指针) ]; z+ X4 a7 b2 G4 _: _" ^% W
  34. *        返 回 值: 无
    $ N; @9 H' F. D( i' ~1 C: x# f
  35. *********************************************************************************************************
    9 I, @4 ?) A: y' b/ D: C
  36. */
    & y) A& d5 b$ D9 ~7 j; I
  37. void InitDialog(WM_MESSAGE * pMsg); ?2 T& s' t' Y5 Y. a# l
  38. {
    7 s0 m, z/ B: F
  39.     WM_HWIN hWin = pMsg->hWin;% X; ~4 n# x. t$ N# U; B; M1 _
  40.     //8 W4 @* u7 e5 b7 k0 s6 m
  41.     //FRAMEWIN0 Y/ D1 r) X9 U* A# y5 e2 M
  42.     //  V5 ^: V5 m' P2 \) }8 S
  43.     FRAMEWIN_SetFont(hWin,&SIF_Font);5 i$ f1 ~) S* f# p0 u( g% G
  44.     FRAMEWIN_SetTextAlign(hWin,GUI_TA_VCENTER|GUI_TA_CENTER);6 s1 `& M# r2 W- C, R& s9 ~
  45.     FRAMEWIN_AddCloseButton(hWin, FRAMEWIN_BUTTON_RIGHT, 0);
    " m- t5 {% G' X8 J0 H
  46.     FRAMEWIN_AddMaxButton(hWin, FRAMEWIN_BUTTON_RIGHT, 1);9 e/ B2 w" M" W6 x1 A, z
  47.     FRAMEWIN_AddMinButton(hWin, FRAMEWIN_BUTTON_RIGHT, 2);7 Q: W" y/ {: m1 Y; K6 W5 Z
  48.     FRAMEWIN_SetTitleHeight(hWin,35);; M0 I+ Z+ S4 Q6 L3 J9 g
  49.     //3 Q6 T! {1 {0 X; e8 t5 w
  50.     //GUI_ID_BUTTON0* I, b% V: G" c. X
  51.     //
    ) j( ]* D: L* z0 Z; M# m$ P
  52. GUI_UC_SetEncodeUTF8();  (1)
    9 S  R4 n+ V# \8 c9 U  @
  53.     BUTTON_SetFont(WM_GetDialogItem(hWin,GUI_ID_BUTTON0),&SIF_Font);(2)
    3 P8 t, r$ a8 }( b* B! g: `
  54.     //
    + z. `# J4 T, }8 \; S
  55.     //GUI_ID_TEXT0
    9 `+ O/ Z# v  u7 _4 |
  56.     //  t% n  }$ D8 m- G
  57. TEXT_SetTextColor(WM_GetDialogItem(hWin,GUI_ID_TEXT0), GUI_RED);
    , v( Z" K' S" z4 b# _( X/ N1 h3 U0 M. z
  58.     TEXT_SetFont(WM_GetDialogItem(hWin,GUI_ID_TEXT0),&SIF_Font);
    # J+ H6 |4 d1 H$ a7 Z# n0 U) }
  59. TEXT_SetTextColor(WM_GetDialogItem(hWin,GUI_ID_TEXT1), GUI_GREEN);# g+ k% @: G0 |- K
  60. TEXT_SetFont(WM_GetDialogItem(hWin,GUI_ID_TEXT1),&SIF_Font);" c& d% z( U( Z) A
  61. TEXT_SetTextColor(WM_GetDialogItem(hWin,GUI_ID_TEXT2), GUI_BLUE);
    ( F# R1 s/ b. k# f2 a( w2 y& ^& v) `
  62. TEXT_SetFont(WM_GetDialogItem(hWin,GUI_ID_TEXT2),&SIF_Font);+ g! A- p, A3 N- s4 I' w  {9 J$ o
  63. TEXT_SetTextColor(WM_GetDialogItem(hWin,GUI_ID_TEXT2), GUI_YELLOW);
    ! D" D: C* A  k' A8 [
  64. TEXT_SetFont(WM_GetDialogItem(hWin,GUI_ID_TEXT3),&SIF_Font);
    : n3 x( o1 j5 `* k7 R0 Y8 [6 W
  65. //         GUI_UC_SetEncodeNone();4 N' a$ M6 o, _2 X$ `
  66. }8 Z$ [7 Y/ ]* }# A3 f! K- E
  67. / k! b! X3 ~( v, @) ?
  68. /*
    0 [: T( n3 Y/ ^& w+ u
  69. *********************************************************************************************************
    ! R; K4 ]8 b  x
  70. *        函 数 名: _cbCallback
    : s, _% e9 e3 Z
  71. *        功能说明: 对话框回调函数
    , H+ c& ~5 A) ]
  72. *        形    参:无1 K$ A0 p5 m0 ^3 \
  73. *        返 回 值: 无
    , V! z7 W, k: ~3 q
  74. *********************************************************************************************************
    & i1 N. H* ^/ C( [
  75. */, s5 Z. p3 Q. Y
  76. static void _cbCallback(WM_MESSAGE * pMsg) % D- z# _2 a2 d4 `) K  q9 E  a
  77. {+ W: d- P& C! {5 @
  78.     int NCode, Id;
    . L* J" c( k% K0 Y+ W3 z3 n" b
  79.     WM_HWIN hWin = pMsg->hWin;
    % ?$ E2 a) f! A
  80.     switch (pMsg->MsgId)
    + W# i5 \3 e+ Q! B) _, s
  81.     {8 m/ t" {4 W2 a
  82.         case WM_PAINT:/ Q. J1 c! }3 s" j3 W/ E/ M
  83.             PaintDialog(pMsg);
    6 f* \- x. {* F) G8 Y) e% R: \; K
  84.             break;
    - h2 y9 i9 X- s) Z& m
  85.         case WM_INIT_DIALOG:
    4 M$ C/ ?' p) m0 I# U0 J
  86.             InitDialog(pMsg);
      t+ d/ t7 \" _% y( D% M2 }
  87.             break;
    + S0 K9 R; c. r7 N
  88.         case WM_KEY:5 X+ t  R, {3 |5 p. G
  89.             switch (((WM_KEY_INFO*)(pMsg->Data.p))->Key) 6 k: S( F: I% V% ^9 `: h  t! g
  90.             {. [# W, t, B" ?- S6 N* C2 j
  91.                 case GUI_KEY_ESCAPE:
    $ k$ G/ W. ?3 q: v. y6 U5 U, p
  92.                     GUI_EndDialog(hWin, 1);
    - x9 w9 \. L2 B3 H0 O" X2 P# @, g
  93.                     break;8 l- }) d/ z" P. S: g
  94.                 case GUI_KEY_ENTER:
    2 G  L4 R/ ^4 \! f2 A3 R
  95.                     GUI_EndDialog(hWin, 0);( F7 D; F5 l. ?1 l9 S0 e! {+ N
  96.                     break;* c& G6 g4 }: s
  97.             }7 m/ N+ u+ ~3 T  z% ~: E
  98.             break;
    6 U5 f0 n8 Z$ M. a: |; p& r
  99.         case WM_NOTIFY_PARENT:: f4 @# D# _9 X: @
  100.             Id = WM_GetId(pMsg->hWinSrc);
    / g$ i! w) u  @
  101.             NCode = pMsg->Data.v;        % `- R' g" e9 x
  102.             switch (Id)
    8 A$ _3 q; e, a2 Y* H9 K
  103.             {
    . \5 [1 A$ `2 ^; d  u' S0 _
  104.                 case GUI_ID_OK:
      A: \+ x6 @! H. M$ n9 Z
  105.                     if(NCode==WM_NOTIFICATION_RELEASED)! w; K( K0 C4 r8 V8 g& m/ ]
  106.                         GUI_EndDialog(hWin, 0);
      w# q6 v( y9 w! n- F0 E
  107.                     break;, z2 P9 Y. A  k! j+ |* O
  108.                 case GUI_ID_CANCEL:
    + a/ @& x3 u  \! E% r+ |$ m
  109.                     if(NCode==WM_NOTIFICATION_RELEASED)
    + R$ o& X* r( v  E8 a1 \
  110.                         GUI_EndDialog(hWin, 0);$ Q5 z6 o+ @! T: L' ]& k% k
  111.                     break;! I  x: [" I% Z" U; e) v) {- e

  112. $ a3 _0 L) D# W/ q
  113.             }$ \- b8 x! R/ l  z( t7 Y) Q$ o2 ]/ N' {, G
  114.             break;) |; I6 U( ]; O; @+ b0 R' k
  115.         default:
    7 G8 c. Y; E7 g* O5 F5 ^* ]& s
  116.             WM_DefaultProc(pMsg);& x0 k2 t$ ]# E2 Q9 J
  117.     }
    9 L. N* g) k. l7 \0 l* m5 {
  118. }
复制代码
1. 使能UTF-8解码。
2. 使用SIF字体,其它控件类似。
3. 特别注意这个程序是在MainTask.c文件里面实现的,这个文件的编码格式必须得是UTF-8,设置方法看前面18.1.6小节。
实际显示效果如下:
21.5.png
    特别注意,如果使用的是800*480分辨率的屏可以完成显示出来,如果是小于这个分辨率的屏只能显示出一部分,大家可以按照上面的设计方法做一个适合自己屏大小的显示或者直接拖动这个对话框即可。
21.3 总结
    SIF字体适合用在有大容量的SRAM或者SDRAM中,显示速度当然也快很多。

/ q$ L2 D+ P7 z% [
赞 收藏 评论5 发布时间:2015-1-31 11:17

举报

5个回答
时光碎了天 回答时间:2015-1-31 11:52:52
再次学习了的
20091217083309-1058990770.jpg
feel-376797 回答时间:2015-1-31 11:55:40
谢谢分享
cxtarm 回答时间:2015-1-31 12:55:53
顶
& A8 |& b3 b+ W( D- [; q
拼命三郎 回答时间:2015-1-31 13:44:22
stm32.jpg
党国特派员 回答时间:2015-1-31 14:10:36
下来学习了
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版