硬汉嵌入式论坛

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

[emWin教程入门篇] 【STemWin教程】第18章 汉字显示方式一(FontCvt的使用)

[复制链接]

740

主题

1326

回帖

3546

积分

管理员

春暖花开

Rank: 9Rank: 9Rank: 9

积分
3546
QQ
发表于 2015-1-27 11:00:53 | 显示全部楼层 |阅读模式
特别说明:完整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.7.png 18.6.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.19.png


18.3.3 第三步:打开FontCvt软件并设置显示字体

18.20.png
18.21.png

18.3.4 第四步:选择禁止所有的字符
18.22.png

18.3.5 第五步:读取前面的txt文件

18.23.png

18.3.6 第六步:然后点击保存为C文件

18.25.png 18.24.png

    通过这种方式生成的C文件就非常容易了。

18.4 总结
    本期教程就为大家讲这么多,有兴趣的可以尝试一下其它字体的显示效果。如果大家使用的是IAR的话,现在IAR6.7及其以上的版本可以直接设置UTF-8编码,由于开发板配套的工程统一使用的是IAR6.3,但是IAR6.3按照本期教程的做法会出现乱码,所以没有提供IAR版本的工程代码。
努力打造安富莱高质量微信公众号:点击扫描图片关注
回复

使用道具 举报

0

主题

3

回帖

3

积分

新手上路

积分
3
发表于 2019-1-11 16:55:03 | 显示全部楼层
GUIBuilder这个里面不能输入汉字,你是怎么处理这个安富莱的文本的啊
回复

使用道具 举报

0

主题

3

回帖

3

积分

新手上路

积分
3
发表于 2019-1-11 16:55:53 | 显示全部楼层
button里面的安富莱是在代码里面自己改的吗,能在GUIBuilder这个里面输入直接生成C文件吗
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106959
QQ
发表于 2019-1-11 17:11:17 | 显示全部楼层
刘秀_q85B5 发表于 2019-1-11 16:55
button里面的安富莱是在代码里面自己改的吗,能在GUIBuilder这个里面输入直接生成C文件吗

GUIBuilder不支持中文,要直接在工程里面搞。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-11 19:23 , Processed in 0.174383 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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