微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 第18章 汉字显示方式一(FontCvt的使用)

第18章 汉字显示方式一(FontCvt的使用)

时间:10-02 整理:3721RD 点击:

第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.2 第二步:打开选择字体和字体大小



18.1.3 第三步:选择禁止所有的字符



18.1.4 第四步:用unicode软件转换函数

用中文转unicode的小软件得到“安富莱电子”这5个字的unicode编码我这里在百度上面找了一个网页应用。



18.1.5 第五步:在FontCvt上使能这个五个字的编码

在Font Converter软件上面使能这个五个字的unicode编码,以“安”字为例它的unicode编码是5b89,这里有两种办法找这个字。

方法一:直接的在软件里面查找,根据左边的unicode编码。



方法二:通过限制范围查找。






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文件里面,主程序如下:

  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了。修改编码格式的方法很简单:



实际显示效果如下,显示效果还是非常棒的,特别是抗锯齿字体。



    特别注意,如果使用的是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版本的工程代码。


18.4   总结

    本期教程就为大家讲这么多,有兴趣的可以尝试一下其它字体的显示效果。如果大家使用的是IAR的话,现在IAR6.7及其以上的版本可以直接设置UTF-8编码,由于开发板配套的工程统一使用的是IAR6.3,但是IAR6.3按照本期教程的做法会出现乱码,所以没有提供IAR版本的工程代码。


ding ding ding ding ding ding ding ding ding ding ding ding ding ding ding ding ding ding ding ding ding ding

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top