硬汉嵌入式论坛

 找回密码
 立即注册
查看: 4536|回复: 2
收起左侧

[emWin教程入门篇] 【STemWin教程】第21章 SIF系统独立字体(官方推荐)

[复制链接]

740

主题

1326

回帖

3546

积分

管理员

春暖花开

Rank: 9Rank: 9Rank: 9

积分
3546
QQ
发表于 2015-1-29 10:48:11 | 显示全部楼层 |阅读模式
特别说明:完整STemWin的1-60期教程和配套实例下载地址:链接
第21章 SIF系统独立字体(官方推荐)

    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

21.2 移植到开发板上显示
    移植到开发上的程序主要分为两部分,一个是从SD卡中读取字体加载到外部SRAM里面,另一个建立一个对话框显示字体。

21.2.1 创建SIF字体
  1. /*
  2. *********************************************************************************************************
  3. *    函 数 名: MainTask
  4. *    功能说明: GUI主函数
  5. *    形    参:无
  6. *    返 回 值: 无
  7. *********************************************************************************************************
  8. */
  9. void MainTask(void)
  10. {
  11. OS_ERR          err;
  12. char *_acBuffer;
  13. _acBuffer = (char *)EXT_SRAM_ADDR; (1)
  14. GUI_Init();
  15. /* 打开文件 */
  16. OSSchedLock(&err);(2)
  17. result = f_open(&file, "son.sif", FA_OPEN_EXISTING | FA_READ | FA_OPEN_ALWAYS);
  18. result = f_read(&file, _acBuffer, file.fsize, &bw);(3)
  19. OSSchedUnlock(&err);
  20. GUI_SIF_CreateFont(_acBuffer, &SIF_Font, GUI_SIF_TYPE_PROP);(4)
  21. WM_SetDesktopColor(GUI_WHITE);      
  22. WM_SetCreateFlags(WM_CF_MEMDEV);   
  23. PROGBAR_SetDefaultSkin(PROGBAR_SKIN_FLEX);
  24. FRAMEWIN_SetDefaultSkin(FRAMEWIN_SKIN_FLEX);
  25. PROGBAR_SetDefaultSkin(PROGBAR_SKIN_FLEX);
  26. BUTTON_SetDefaultSkin(BUTTON_SKIN_FLEX);
  27. CHECKBOX_SetDefaultSkin(CHECKBOX_SKIN_FLEX);
  28. DROPDOWN_SetDefaultSkin(DROPDOWN_SKIN_FLEX);
  29. SCROLLBAR_SetDefaultSkin(SCROLLBAR_SKIN_FLEX);
  30. SLIDER_SetDefaultSkin(SLIDER_SKIN_FLEX);
  31. HEADER_SetDefaultSkin(HEADER_SKIN_FLEX);
  32. RADIO_SetDefaultSkin(RADIO_SKIN_FLEX);
  33.     GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), &_cbCallback, 0, 0, 0);
  34. while(1)
  35. {
  36. GUI_Delay(100);
  37. }
  38. }
复制代码
1. 指针变量指向外部SRAM首地址。
2. 加上调度锁,防止从SD卡中加载数据到SRAM时出错
3. 从SD卡中加载数据到外部SRAM中。
4. 创建SIF字体

21.2.2 主函数
  1. GUI_FONT SIF_Font;
  2. /*
  3. *********************************************************************************************************
  4. *              对话框信息
  5. *********************************************************************************************************
  6. */
  7. static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {
  8.     { FRAMEWIN_CreateIndirect,  "安富莱电子论坛欢迎大家",     0,                       0,  0,  800,480,FRAMEWIN_CF_MOVEABLE,0},
  9.     { BUTTON_CreateIndirect,    "安富莱电子www.armfly.com",                    GUI_ID_BUTTON0,          390,40,360,100,0,0},
  10.     { TEXT_CreateIndirect,      "安富莱电子www.armfly.com",                    GUI_ID_TEXT0,            5, 10, 300, 40, 0,0},
  11.     { TEXT_CreateIndirect,      "安富莱电子www.armfly.com",                    GUI_ID_TEXT1,            5, 50,300, 40, 0,0},
  12.     { TEXT_CreateIndirect,      "安富莱电子www.armfly.com",                    GUI_ID_TEXT2,            5, 90,300, 40, 0,0},
  13. { TEXT_CreateIndirect,     "安富莱电子www。armfly。com",      GUI_ID_TEXT3,            5, 159,500, 40, 0,0}
  14. };
  15. /*
  16. *********************************************************************************************************
  17. *    函 数 名: PaintDialog
  18. *    功能说明: 重绘函数
  19. *    形    参:pMsg 消息指针
  20. *    返 回 值: 无
  21. *********************************************************************************************************
  22. */
  23. void PaintDialog(WM_MESSAGE * pMsg)
  24. {
  25.     WM_HWIN hWin = pMsg->hWin;
  26. }
  27. /*
  28. *********************************************************************************************************
  29. *    函 数 名: InitDialog
  30. *    功能说明: 对话框初始化
  31. *    形    参:pMsg 消息指针
  32. *    返 回 值: 无
  33. *********************************************************************************************************
  34. */
  35. void InitDialog(WM_MESSAGE * pMsg)
  36. {
  37.     WM_HWIN hWin = pMsg->hWin;
  38.     //
  39.     //FRAMEWIN
  40.     //
  41.     FRAMEWIN_SetFont(hWin,&SIF_Font);
  42.     FRAMEWIN_SetTextAlign(hWin,GUI_TA_VCENTER|GUI_TA_CENTER);
  43.     FRAMEWIN_AddCloseButton(hWin, FRAMEWIN_BUTTON_RIGHT, 0);
  44.     FRAMEWIN_AddMaxButton(hWin, FRAMEWIN_BUTTON_RIGHT, 1);
  45.     FRAMEWIN_AddMinButton(hWin, FRAMEWIN_BUTTON_RIGHT, 2);
  46.     FRAMEWIN_SetTitleHeight(hWin,35);
  47.     //
  48.     //GUI_ID_BUTTON0
  49.     //
  50. GUI_UC_SetEncodeUTF8();  (1)
  51.     BUTTON_SetFont(WM_GetDialogItem(hWin,GUI_ID_BUTTON0),&SIF_Font);(2)
  52.     //
  53.     //GUI_ID_TEXT0
  54.     //
  55. TEXT_SetTextColor(WM_GetDialogItem(hWin,GUI_ID_TEXT0), GUI_RED);
  56.     TEXT_SetFont(WM_GetDialogItem(hWin,GUI_ID_TEXT0),&SIF_Font);
  57. TEXT_SetTextColor(WM_GetDialogItem(hWin,GUI_ID_TEXT1), GUI_GREEN);
  58. TEXT_SetFont(WM_GetDialogItem(hWin,GUI_ID_TEXT1),&SIF_Font);
  59. TEXT_SetTextColor(WM_GetDialogItem(hWin,GUI_ID_TEXT2), GUI_BLUE);
  60. TEXT_SetFont(WM_GetDialogItem(hWin,GUI_ID_TEXT2),&SIF_Font);
  61. TEXT_SetTextColor(WM_GetDialogItem(hWin,GUI_ID_TEXT2), GUI_YELLOW);
  62. TEXT_SetFont(WM_GetDialogItem(hWin,GUI_ID_TEXT3),&SIF_Font);
  63. //     GUI_UC_SetEncodeNone();
  64. }
  65. /*
  66. *********************************************************************************************************
  67. *    函 数 名: _cbCallback
  68. *    功能说明: 对话框回调函数
  69. *    形    参:无
  70. *    返 回 值: 无
  71. *********************************************************************************************************
  72. */
  73. static void _cbCallback(WM_MESSAGE * pMsg)
  74. {
  75.     int NCode, Id;
  76.     WM_HWIN hWin = pMsg->hWin;
  77.     switch (pMsg->MsgId)
  78.     {
  79.         case WM_PAINT:
  80.             PaintDialog(pMsg);
  81.             break;
  82.         case WM_INIT_DIALOG:
  83.             InitDialog(pMsg);
  84.             break;
  85.         case WM_KEY:
  86.             switch (((WM_KEY_INFO*)(pMsg->Data.p))->Key)
  87.             {
  88.                 case GUI_KEY_ESCAPE:
  89.                     GUI_EndDialog(hWin, 1);
  90.                     break;
  91.                 case GUI_KEY_ENTER:
  92.                     GUI_EndDialog(hWin, 0);
  93.                     break;
  94.             }
  95.             break;
  96.         case WM_NOTIFY_PARENT:
  97.             Id = WM_GetId(pMsg->hWinSrc);
  98.             NCode = pMsg->Data.v;        
  99.             switch (Id)
  100.             {
  101.                 case GUI_ID_OK:
  102.                     if(NCode==WM_NOTIFICATION_RELEASED)
  103.                         GUI_EndDialog(hWin, 0);
  104.                     break;
  105.                 case GUI_ID_CANCEL:
  106.                     if(NCode==WM_NOTIFICATION_RELEASED)
  107.                         GUI_EndDialog(hWin, 0);
  108.                     break;
  109.             }
  110.             break;
  111.         default:
  112.             WM_DefaultProc(pMsg);
  113.     }
  114. }
复制代码
1. 使能UTF-8解码。
2. 使用SIF字体,其它控件类似。
3. 特别注意这个程序是在MainTask.c文件里面实现的,这个文件的编码格式必须得是UTF-8,设置方法看前面18.1.6小节。
实际显示效果如下:
21.5.png

    特别注意,如果使用的是800*480分辨率的屏可以完成显示出来,如果是小于这个分辨率的屏只能显示出一部分,大家可以按照上面的设计方法做一个适合自己屏大小的显示或者直接拖动这个对话框即可。

21.3 总结
    SIF字体适合用在有大容量的SRAM或者SDRAM中,显示速度当然也快很多。
努力打造安富莱高质量微信公众号:点击扫描图片关注
回复

使用道具 举报

1

主题

2

回帖

5

积分

新手上路

积分
5
发表于 2015-1-30 17:59:25 | 显示全部楼层
最近在调EmWin的SIF汉字显示,
在MainTask中创建字体:    GUI_SIF_CreateFont(UNICODE16,&SIF_Font,GUI_SIF_TYPE_PROP);
然后
  { TEXT_CreateIndirect,      "we汉字SIF实验e",                GUI_ID_TEXT0,            SIZE_X+150,SIZE_Y0, 220,43, 0,0},
然后        GUI_UC_SetEncodeUTF8();
        BUTTON_SetFont(WM_GetDialogItem(hWin,GUI_ID_TEXT0),&SIF_Font);

屏幕上只能显示英文和字符,中文都不显示,求解,文件已经转成UTF-8编码
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107049
QQ
发表于 2015-1-30 18:28:06 | 显示全部楼层

回 kennann 的帖子

kennann:最近在调EmWin的SIF汉字显示,
在MainTask中创建字体:    GUI_SIF_CreateFont(UNICODE16,&SIF_Font,GUI_SIF_TYPE_PROP);
然后
  { TEXT_CreateIndirect,      "we汉字SIF实验e",   &n .. (2015-01-30 17:59) 
  BUTTON_SetFont是设置按钮字体的。。。   你调用错了,你得调用TEXT控件字体设置。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-16 05:53 , Processed in 0.277269 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表