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

【安富莱STemWin教程】第18章 汉字显示方式一(FontCvt的使用)

[复制链接]
baiyongbin2009 发布时间:2015-1-28 17:28
特别说明:完整STemWin的1-60期教程和配套实例下载地址:链接
第18章 汉字显示方式一(FontCvt的使用)

    本期教程主要跟大家介绍官方的小工具Font Converter的使用方法,使用官方的字体转换工具,字体的显示效果要比网上那些针对UCGUI设计的字体生成工具好非常多。4位抗锯齿的显示效果更是非常棒。在开头先跟大家强调两点,一个是这个字体小工具必须的使用STemWin软件包里面的,SEGGER官网下载的和MDK安装目录里面带的都是评估版,另一点是在教程中我会要求大家将要显示汉字的C文件转换为UTF-8编码,我仅仅是指的将这个显示汉字的C文件转换为UTF-8编码,这点要切记。
    18. 1  使用FontCvt生成字库C文件的方法
    18. 2 在开发板上面实现中文显示
    18. 3 总结

18.1 使用FontCvt生成字库C文件的方法
    我们先讲如何用这个软件生成部分的汉字数据,这里就以“安富莱电子”五个字进行说明。
18.1.1 第一步:打开选择Standard,16bit unicode
18.1.png
18.1.2 第二步:打开选择字体和字体大小
18.2.png
18.1.3 第三步:选择禁止所有的字符
18.3.png
18.1.4 第四步:用unicode软件转换函数
    用中文转unicode的小软件得到“安富莱电子”这5个字的unicode编码我这里在百度上面找了一个网页应用。
18.4.png
18.1.5 第五步:在FontCvt上使能这个五个字的编码
    在Font Converter软件上面使能这个五个字的unicode编码,以“安”字为例它的unicode编码是5b89,这里有两种办法找这个字。
    方法一:直接的在软件里面查找,根据左边的unicode编码。
18.5.png
    方法二:通过限制范围查找。
18.6.png
18.7.png

18.1.6 第六步:然后点击保存为C文件
18.8.png
    要将前面的五个字全部找到并使能以后再做保存。
18.2 在开发板上面实现中文显示
    下面我们用18.1小节讲的汉字生成方式生成7中类型的字体。前三种是Standard的宋体,大小是16,36和72.
18.9.png
    第四种是144*144点阵的,有没有这么大的字体,需要手动往大小选项里面填写144,并选择右侧的Pixels。
18.10.png
    第五种选择4倍抗锯齿,144*144点阵宋体
18.11.png
    第六种选择4倍抗锯齿,扩展比例模式,144*144点阵宋体
18.12.png
    第七种选择4倍抗锯齿,扩展带边框模式,144*144点阵宋体
18.13.png
   MDK工程中专门的建立一个文件用存储上面生成的汉字数据:
18.14.png
主运行函数还是方面MainTask.c文件里面,主程序如下:
  1. #include "includes.h"
  2. #include "MainTask.h"


  3. extern GUI_CONST_STORAGE GUI_FONT GUI_FontSongFont36;(1)
  4. extern GUI_CONST_STORAGE GUI_FONT GUI_FontSongFont;
  5. extern GUI_CONST_STORAGE GUI_FONT GUI_FontSongFont72;
  6. extern GUI_CONST_STORAGE GUI_FONT GUI_FontSongFont144;
  7. extern GUI_CONST_STORAGE GUI_FONT GUI_FontSongFontA144;
  8. extern GUI_CONST_STORAGE GUI_FONT GUI_FontSongFontAEx144;
  9. extern GUI_CONST_STORAGE GUI_FONT GUI_FontSongFontAExF144;
  10. /*
  11. *********************************************************************************************************
  12. *        创建对话框信息
  13. *********************************************************************************************************
  14. */
  15. static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {
  16.     { FRAMEWIN_CreateIndirect,  "armfly",            0,                       0,  0,  800,480,FRAMEWIN_CF_MOVEABLE,0},
  17.     { BUTTON_CreateIndirect,    "安富莱",            GUI_ID_BUTTON0,          350,20,420,150,0,0},
  18.     { TEXT_CreateIndirect,      "安富莱电子",        GUI_ID_TEXT0,            5, 10, 300, 33, 0,0},
  19.     { TEXT_CreateIndirect,      "安富莱电子",        GUI_ID_TEXT1,            5, 40,250, 50, 0,0},
  20.     { TEXT_CreateIndirect,      "安富莱",            GUI_ID_TEXT2,            5, 100,360, 90, 0,0},
  21.     { TEXT_CreateIndirect,      "富",                GUI_ID_TEXT3,            5, 220,144, 144, 0,0},
  22.     { TEXT_CreateIndirect,      "富",                GUI_ID_TEXT4,            205, 230,144, 144, 0,0},
  23.     { TEXT_CreateIndirect,      "富",                GUI_ID_TEXT5,            405, 230,144, 144, 0,0},
  24.     { TEXT_CreateIndirect,      "富",                GUI_ID_TEXT6,            605, 230,144, 144, 0,0}
  25. };

  26. /*
  27. *********************************************************************************************************
  28. *        函 数 名: PaintDialog
  29. *        功能说明: 对话框重绘函数
  30. *        形    参:pMsg   消息指针
  31. *        返 回 值: 无
  32. *********************************************************************************************************
  33. */
  34. void PaintDialog(WM_MESSAGE * pMsg)
  35. {
  36.     WM_HWIN hWin = pMsg->hWin;
  37. }

  38. /*
  39. *********************************************************************************************************
  40. *        函 数 名: 对话框初始化
  41. *        功能说明: 对话框初始化
  42. *        形    参:pMsg   消息指针
  43. *        返 回 值: 无
  44. *********************************************************************************************************
  45. */
  46. void InitDialog(WM_MESSAGE * pMsg)
  47. {
  48.     WM_HWIN hWin = pMsg->hWin;
  49.     //
  50.     //FRAMEWIN
  51.     //
  52.     FRAMEWIN_SetFont(hWin,&GUI_Font32B_ASCII);
  53.     FRAMEWIN_SetTextAlign(hWin,GUI_TA_VCENTER|GUI_TA_CENTER);
  54.     FRAMEWIN_AddCloseButton(hWin, FRAMEWIN_BUTTON_RIGHT, 0);
  55.     FRAMEWIN_AddMaxButton(hWin, FRAMEWIN_BUTTON_RIGHT, 1);
  56.     FRAMEWIN_AddMinButton(hWin, FRAMEWIN_BUTTON_RIGHT, 2);
  57.     FRAMEWIN_SetTitleHeight(hWin,35);
  58.     //
  59.     //GUI_ID_BUTTON0
  60.     //
  61. GUI_UC_SetEncodeUTF8();(2)
  62.     BUTTON_SetFont(WM_GetDialogItem(hWin,GUI_ID_BUTTON0),&GUI_FontSongFontA144);(3)
  63.     //
  64.     //GUI_ID_TEXT0
  65.     //
  66. TEXT_SetTextColor(WM_GetDialogItem(hWin,GUI_ID_TEXT0), GUI_RED);
  67.     TEXT_SetFont(WM_GetDialogItem(hWin,GUI_ID_TEXT0),&GUI_FontSongFont);
  68. TEXT_SetTextColor(WM_GetDialogItem(hWin,GUI_ID_TEXT1), GUI_GREEN);
  69. TEXT_SetFont(WM_GetDialogItem(hWin,GUI_ID_TEXT1),&GUI_FontSongFont36);
  70. TEXT_SetTextColor(WM_GetDialogItem(hWin,GUI_ID_TEXT2), GUI_BLUE);
  71. TEXT_SetFont(WM_GetDialogItem(hWin,GUI_ID_TEXT2),&GUI_FontSongFont72);
  72. TEXT_SetFont(WM_GetDialogItem(hWin,GUI_ID_TEXT3),&GUI_FontSongFont144);
  73. TEXT_SetFont(WM_GetDialogItem(hWin,GUI_ID_TEXT4),&GUI_FontSongFontAEx144);
  74. TEXT_SetFont(WM_GetDialogItem(hWin,GUI_ID_TEXT5),&GUI_FontSongFontA144);
  75. TEXT_SetFont(WM_GetDialogItem(hWin,GUI_ID_TEXT6),&GUI_FontSongFontAExF144);
  76. //         GUI_UC_SetEncodeNone();
  77. }

  78. /*
  79. *********************************************************************************************************
  80. *        函 数 名: _cbCallback
  81. *        功能说明: 对话框回调函数
  82. *        形    参:pMsg   消息指针
  83. *        返 回 值: 无
  84. *********************************************************************************************************
  85. */
  86. static void _cbCallback(WM_MESSAGE * pMsg)
  87. {
  88.     int NCode, Id;
  89.     WM_HWIN hWin = pMsg->hWin;
  90.     switch (pMsg->MsgId)
  91.     {
  92.         case WM_PAINT:
  93.             PaintDialog(pMsg);
  94.             break;
  95.         case WM_INIT_DIALOG:
  96.             InitDialog(pMsg);
  97.             break;
  98.         case WM_KEY:
  99.             switch (((WM_KEY_INFO*)(pMsg->Data.p))->Key)
  100.             {
  101.                 case GUI_KEY_ESCAPE:
  102.                     GUI_EndDialog(hWin, 1);
  103.                     break;
  104.                 case GUI_KEY_ENTER:
  105.                     GUI_EndDialog(hWin, 0);
  106.                     break;
  107.             }
  108.             break;
  109.         case WM_NOTIFY_PARENT:
  110.             Id = WM_GetId(pMsg->hWinSrc);
  111.             NCode = pMsg->Data.v;        
  112.             switch (Id)
  113.             {
  114.                 case GUI_ID_OK:
  115.                     if(NCode==WM_NOTIFICATION_RELEASED)
  116.                         GUI_EndDialog(hWin, 0);
  117.                     break;
  118.                 case GUI_ID_CANCEL:
  119.                     if(NCode==WM_NOTIFICATION_RELEASED)
  120.                         GUI_EndDialog(hWin, 0);
  121.                     break;

  122.             }
  123.             break;
  124.         default:
  125.             WM_DefaultProc(pMsg);
  126.     }
  127. }

  128. /*
  129. *********************************************************************************************************
  130. *        函 数 名: MainTask
  131. *        功能说明: GUI主任务
  132. *        形    参:无
  133. *        返 回 值: 无
  134. *********************************************************************************************************
  135. */
  136. void MainTask(void)
  137. {
  138.     GUI_Init();
  139.     WM_SetDesktopColor(GUI_WHITE);       /* Automacally update desktop window */
  140.     WM_SetCreateFlags(WM_CF_MEMDEV);     /* Use memory devices on all windows to avoid flicker */
  141. PROGBAR_SetDefaultSkin(PROGBAR_SKIN_FLEX);
  142. FRAMEWIN_SetDefaultSkin(FRAMEWIN_SKIN_FLEX);
  143. PROGBAR_SetDefaultSkin(PROGBAR_SKIN_FLEX);
  144. BUTTON_SetDefaultSkin(BUTTON_SKIN_FLEX);
  145. CHECKBOX_SetDefaultSkin(CHECKBOX_SKIN_FLEX);
  146. DROPDOWN_SetDefaultSkin(DROPDOWN_SKIN_FLEX);
  147. SCROLLBAR_SetDefaultSkin(SCROLLBAR_SKIN_FLEX);
  148. SLIDER_SetDefaultSkin(SLIDER_SKIN_FLEX);
  149. HEADER_SetDefaultSkin(HEADER_SKIN_FLEX);
  150. RADIO_SetDefaultSkin(RADIO_SKIN_FLEX);
  151.     GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), &_cbCallback, 0, 0, 0);
  152. while(1)
  153. {
  154. GUI_Delay(10);
  155. }
  156. }
复制代码
1. 通过extern声明要调用的字体。
2. 使能UTF-8解码格式。
3. 使用相关的汉字字体。
4. 运行程序前,一定要保证这个MainTask.c文件的编码格式是UTF-8。有时候经过复制粘贴,网络上传和下载等原因,编码格式不再是UTF-8了。修改编码格式的方法很简单:
18.15.png
    实际显示效果如下,显示效果还是非常棒的,特别是抗锯齿字体。
18.16.png
    特别注意,如果使用的是800*480分辨率的屏可以完成显示出来,如果是小于这个分辨率的屏只能显示出一部分,大家可以按照上面的设计方法做一个适合自己屏大小的显示或者直接拖动这个对话框即可。
18.3 使用FontCvt生成字库C文件的简单方法
    前面18.1小节介绍的方面有点麻烦,这里介绍一种简单的方法。
18.3.1 第一步:建立txt文件,并写入汉字
18.17.png
18.3.2 第二步:另存为unicode编码格式
18.18.png
18.3.3 第三步:打开FontCvt软件并设置显示字体
18.19.png
18.20.png
18.3.4 第四步:选择禁止所有的字符
18.21.png
18.3.5 第五步:读取前面的txt文件
18.22.png
18.3.6 第六步:然后点击保存为C文件
18.23.png
18.24.png   
    通过这种方式生成的C文件就非常容易了。
18.4 总结
    本期教程就为大家讲这么多,有兴趣的可以尝试一下其它字体的显示效果。如果大家使用的是IAR的话,现在IAR6.7及其以上的版本可以直接设置UTF-8编码,由于开发板配套的工程统一使用的是IAR6.3,但是IAR6.3按照本期教程的做法会出现乱码,所以没有提供IAR版本的工程代码。

收藏 评论10 发布时间:2015-1-28 17:28

举报

10个回答
caizhiwei 回答时间:2015-1-28 17:50:50
爽啊。曾经研究了好久!
麟狮蕟 回答时间:2015-1-28 21:15:18
这么好的东西
埃斯提爱慕 回答时间:2015-1-29 09:12:43
提示: 作者被禁止或删除 内容自动屏蔽
Eagleson 回答时间:2015-1-29 14:27:35
不错,学习学习~~
逍遥李 回答时间:2015-1-31 10:32:31
感谢分享…
时光碎了天 回答时间:2015-1-31 12:01:52
再次学习了的
20091217083309-1058990770.jpg
拼命三郎 回答时间:2015-1-31 13:45:41
stm32.jpg
党国特派员 回答时间:2015-1-31 14:10:53
下来学习了
baiyongbin2009 回答时间:2015-2-6 16:37:19
谢谢各位~
caiyuhui74748 回答时间:2015-8-18 11:51:20
好东西值得顶

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版