22.4C文件格式汉字的使用方法
下面讲解22.2小节生成的7种字体C文件的使用方法,这里将MDK和IAR分别进行说明:
22.4.1 MDK编译器中使用C文件格式汉字的方法
第1步:将生成的7种字体文件添加到MDK工程目录里面,本章节配套的例子是将其放在User->fonts文件夹下
第2步:将生成的7种字体文件添加到MDK工程中
第3步:调用函数GUI_UC_SetEncodeUTF8()来使能UTF-8编码,这一步是必须的,切不可以忘了。
第4步:此时就可以使用这7种字体了,打开这7个字体文件,每个文件的开头都有一个extern的字体声明。
extern GUI_CONST_STORAGE GUI_FONT GUI_FontFontSong16;
extern GUI_CONST_STORAGE GUI_FONT GUI_FontFontSong32;
extern GUI_CONST_STORAGE GUI_FONT GUI_FontFontSong72;
extern GUI_CONST_STORAGE GUI_FONT GUI_FontFontSong144;
extern GUI_CONST_STORAGE GUI_FONT GUI_FontFontSongA144;
extern GUI_CONST_STORAGE GUI_FONT GUI_FontFontSongExA144;
extern GUI_CONST_STORAGE GUI_FONT GUI_FontFontSongExF144;
如果用户要在哪个源码文件里面使用这些字体,就把这些字体声明放在相应源文件的开头就行。使用方法,跟使用emWin自带的ASCII和ISO8859-1字体基本是一样的,唯一区别的地方是:调用FontCvt生成的字体时要加上取地址操作&。下面举一个完整的例子,代码在本章节配套例子的MainTask.c文件里面(对于初学者来说,对话框,按钮控件和文本控件还没有讲到,这里只是举个例子,会使用这些新生成的字体即可,后面会讲到这些控件):
- #include "MainTask.h"
- #include "includes.h"
-
-
-
- /*
- *********************************************************************************************************
- * 调用外部字体声明,这个就是第4步中所说的问题
- *********************************************************************************************************
- */
- extern GUI_CONST_STORAGE GUI_FONT GUI_FontFontSong16;
- extern GUI_CONST_STORAGE GUI_FONT GUI_FontFontSong32;
- extern GUI_CONST_STORAGE GUI_FONT GUI_FontFontSong72;
- extern GUI_CONST_STORAGE GUI_FONT GUI_FontFontSong144;
- extern GUI_CONST_STORAGE GUI_FONT GUI_FontFontSongA144;
- extern GUI_CONST_STORAGE GUI_FONT GUI_FontFontSongExA144;
- extern GUI_CONST_STORAGE GUI_FONT GUI_FontFontSongExF144;
-
-
- /*
- *********************************************************************************************************
- * 对话框资源列表
- *********************************************************************************************************
- */
- static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {
- { FRAMEWIN_CreateIndirect, "armfly", 0, 0, 0, 800,480,FRAMEWIN_CF_MOVEABLE,0},
- { BUTTON_CreateIndirect, "安富莱我们我们", GUI_ID_BUTTON0, 350,20,420,150,0,0},
- { TEXT_CreateIndirect, "安富莱电子", GUI_ID_TEXT0, 5, 10, 300, 33, 0,0},
- { TEXT_CreateIndirect, "安富莱电子", GUI_ID_TEXT1, 5, 40,250, 50, 0,0},
- { TEXT_CreateIndirect, "安富莱", GUI_ID_TEXT2, 5, 100,360, 90, 0,0},
- { TEXT_CreateIndirect, "富", GUI_ID_TEXT3, 5, 220,144, 144, 0,0},
- { TEXT_CreateIndirect, "富", GUI_ID_TEXT4, 205, 230,144, 144, 0,0},
- { TEXT_CreateIndirect, "富", GUI_ID_TEXT5, 405, 230,144, 144, 0,0},
- { TEXT_CreateIndirect, "富", GUI_ID_TEXT6, 605, 230,144, 144, 0,0}
- };
-
- /*
- *********************************************************************************************************
- * 函 数 名: PaintDialog
- * 功能说明: 对话框重绘函数
- * 形 参:pMsg 消息指针
- * 返 回 值: 无
- *********************************************************************************************************
- */
- void PaintDialog(WM_MESSAGE * pMsg)
- {
- // WM_HWIN hWin = pMsg->hWin;
-
- }
-
- /*
- *********************************************************************************************************
- * 函 数 名: 对话框初始化
- * 功能说明: 对话框初始化
- * 形 参: pMsg 消息指针
- * 返 回 值: 无
- *********************************************************************************************************
- */
- void InitDialog(WM_MESSAGE * pMsg)
- {
- WM_HWIN hWin = pMsg->hWin;
-
- //
- // 配置FrameWin
- //
- FRAMEWIN_SetFont(hWin,&GUI_Font32B_ASCII);
- FRAMEWIN_SetTextAlign(hWin,GUI_TA_VCENTER|GUI_TA_CENTER);
- FRAMEWIN_AddCloseButton(hWin, FRAMEWIN_BUTTON_RIGHT, 0);
- FRAMEWIN_AddMaxButton(hWin, FRAMEWIN_BUTTON_RIGHT, 1);
- FRAMEWIN_AddMinButton(hWin, FRAMEWIN_BUTTON_RIGHT, 2);
- FRAMEWIN_SetTitleHeight(hWin,35);
-
- /* 外部的7种字体在文件控件TEXT和按钮控件BUTTON中都使用了,具体调用方法如下,
- 跟使用emWin自带的字体是一样的。*/
- //
- // 按钮的字体是4倍抗锯齿,144点阵
- //
- BUTTON_SetFont(WM_GetDialogItem(hWin,GUI_ID_BUTTON0),&GUI_FontFontSongA144);
-
- //
- // 分别用16点阵,32点阵和72点阵字体显示 安富莱电子 五个字。
- //
- TEXT_SetTextColor(WM_GetDialogItem(hWin,GUI_ID_TEXT0), GUI_RED);
- TEXT_SetFont(WM_GetDialogItem(hWin,GUI_ID_TEXT0),&GUI_FontFontSong16);
- TEXT_SetTextColor(WM_GetDialogItem(hWin,GUI_ID_TEXT1), GUI_GREEN);
- TEXT_SetFont(WM_GetDialogItem(hWin,GUI_ID_TEXT1),&GUI_FontFontSong32);
- TEXT_SetTextColor(WM_GetDialogItem(hWin,GUI_ID_TEXT2), GUI_BLUE);
- TEXT_SetFont(WM_GetDialogItem(hWin,GUI_ID_TEXT2),&GUI_FontFontSong72);
-
- //
- // 分别用144点阵汉字,144点阵的扩展模式且4倍抗锯齿汉字,144点阵的4倍抗锯齿汉字和
- // 144点阵的扩展模式且带边框汉字。
- //
- TEXT_SetFont(WM_GetDialogItem(hWin,GUI_ID_TEXT3),&GUI_FontFontSong144);
- TEXT_SetFont(WM_GetDialogItem(hWin,GUI_ID_TEXT4),&GUI_FontFontSongExA144);
- TEXT_SetFont(WM_GetDialogItem(hWin,GUI_ID_TEXT5),&GUI_FontFontSongA144);
- TEXT_SetFont(WM_GetDialogItem(hWin,GUI_ID_TEXT6),&GUI_FontFontSongExF144);
- }
-
- /*
- *********************************************************************************************************
- * 函 数 名: _cbCallback
- * 功能说明: 对话框回调函数
- * 形 参: pMsg 消息指针
- * 返 回 值: 无
- *********************************************************************************************************
- */
- static void _cbCallback(WM_MESSAGE * pMsg)
- {
- int NCode, Id;
- WM_HWIN hWin = pMsg->hWin;
- switch (pMsg->MsgId)
- {
- case WM_PAINT:
- PaintDialog(pMsg);
- break;
-
- case WM_INIT_DIALOG:
- InitDialog(pMsg);
- break;
-
- case WM_KEY:
- switch (((WM_KEY_INFO*)(pMsg->Data.p))->Key)
- {
- case GUI_KEY_ESCAPE:
- GUI_EndDialog(hWin, 1);
- break;
- case GUI_KEY_ENTER:
- GUI_EndDialog(hWin, 0);
- break;
- }
- break;
-
- case WM_NOTIFY_PARENT:
- Id = WM_GetId(pMsg->hWinSrc);
- NCode = pMsg->Data.v;
- switch (Id)
- {
- case GUI_ID_OK:
- if(NCode==WM_NOTIFICATION_RELEASED)
- GUI_EndDialog(hWin, 0);
- break;
-
- case GUI_ID_CANCEL:
- if(NCode==WM_NOTIFICATION_RELEASED)
- GUI_EndDialog(hWin, 0);
- break;
-
- }
- break;
-
- default:
- WM_DefaultProc(pMsg);
- }
- }
-
- /*
- *********************************************************************************************************
- * 函 数 名: MainTask
- * 功能说明: GUI主函数
- * 形 参: 无
- * 返 回 值: 无
- *********************************************************************************************************
- */
- void MainTask(void)
- {
- /* 初始化 */
- GUI_Init();
-
- WM_MULTIBUF_Enable(1);
-
- /* 使能UTF-8编码,这个是第3步中所说的问题,不必限制一定要放在这个位置,使用外部字体之前调用了即可 */
- GUI_UC_SetEncodeUTF8();
-
- /* 调用此函数会自动的刷新桌面窗口 */
- WM_SetDesktopColor(GUI_WHITE);
-
- /* 创建对话框 */
- GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), &_cbCallback, 0, 0, 0);
-
- while(1)
- {
- GUI_Delay(10);
- }
- }
复制代码 通过上面的代码就实现了这7种字体的显示,具体效果可以看实验例程说明。
第5步:这个是最重要的一步,很多初学者显示汉字失败就是因为这一步了。
修改汉字显示所在的源文件,即MainTask.c文件为UTF-8编码,并不是修改FontCvt生成的C文件为UTF-8编码,因为FontCvt软件生成的C文件已经是UTF-8编码了。也就是说哪个文件用到这种汉字显示了,哪个文件就修改编码类型为UTF-8,只有这样,MDK才可以将这些汉字的编码识别出来,要不识别出来的汉字编码与FontCvt生成字体的编码类型不匹配,从而无法正确显示。
修改编码类型也比较容易,使用电脑自带的记事本即可,将MainTask.C文件用记事本打开:
点击文件->另存为
弹出如下窗口:
点击保存后,会弹出如下窗口:
重新切换回MDK工程,也会弹出一个窗口:
这样MainTask.c文件就变成UTF-8编码了。此时就可以全编译工程并下载例子到开发板进行测试了。
22.4.2 IAR编译器中使用C文件格式汉字的方法
第1步:将生成的7种字体文件添加到IAR工程目录里面,本章节配套的例子是将其放在User->fonts文件夹下
第2步:将生成的7种字体文件添加到IAR工程中
第3步:调用函数GUI_UC_SetEncodeUTF8()来使能UTF-8编码,这一步是必须的,切不可以忘了。
第4步:此时就可以使用这7种字体了,打开这7个字体文件,每个文件的开头都有一个extern的字体声明。
extern GUI_CONST_STORAGE GUI_FONT GUI_FontFontSong16;
extern GUI_CONST_STORAGE GUI_FONT GUI_FontFontSong32;
extern GUI_CONST_STORAGE GUI_FONT GUI_FontFontSong72;
extern GUI_CONST_STORAGE GUI_FONT GUI_FontFontSong144;
extern GUI_CONST_STORAGE GUI_FONT GUI_FontFontSongA144;
extern GUI_CONST_STORAGE GUI_FONT GUI_FontFontSongExA144;
extern GUI_CONST_STORAGE GUI_FONT GUI_FontFontSongExF144;
如果用户要在哪个源码文件里面使用这些字体,就把这些字体声明放在相应源文件的开头就行。使用方法,跟使用emWin自带的ASCII和ISO8859-1字体基本是一样的,唯一区别的地方是:调用FontCvt生成的字体时要加上取地址操作&。下面举一个完整的例子,代码在本章节配套例子的MainTask.c文件里面(对于初学者来说,对话框,按钮控件和文本控件还没有讲到,这里只是举个例子,会使用这些新生成的字体即可,后面会讲到这些控件):
- #include "MainTask.h"
- #include "includes.h"
-
-
-
- /*
- *********************************************************************************************************
- * 调用外部字体声明,这个就是第4步中所说的问题
- *********************************************************************************************************
- */
- extern GUI_CONST_STORAGE GUI_FONT GUI_FontFontSong16;
- extern GUI_CONST_STORAGE GUI_FONT GUI_FontFontSong32;
- extern GUI_CONST_STORAGE GUI_FONT GUI_FontFontSong72;
- extern GUI_CONST_STORAGE GUI_FONT GUI_FontFontSong144;
- extern GUI_CONST_STORAGE GUI_FONT GUI_FontFontSongA144;
- extern GUI_CONST_STORAGE GUI_FONT GUI_FontFontSongExA144;
- extern GUI_CONST_STORAGE GUI_FONT GUI_FontFontSongExF144;
-
-
- /*
- *********************************************************************************************************
- * 对话框资源列表
- *********************************************************************************************************
- */
- static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {
- { FRAMEWIN_CreateIndirect, "armfly", 0, 0, 0, 800,480,FRAMEWIN_CF_MOVEABLE,0},
- { BUTTON_CreateIndirect, "安富莱我们我们", GUI_ID_BUTTON0, 350,20,420,150,0,0},
- { TEXT_CreateIndirect, "安富莱电子", GUI_ID_TEXT0, 5, 10, 300, 33, 0,0},
- { TEXT_CreateIndirect, "安富莱电子", GUI_ID_TEXT1, 5, 40,250, 50, 0,0},
- { TEXT_CreateIndirect, "安富莱", GUI_ID_TEXT2, 5, 100,360, 90, 0,0},
- { TEXT_CreateIndirect, "富", GUI_ID_TEXT3, 5, 220,144, 144, 0,0},
- { TEXT_CreateIndirect, "富", GUI_ID_TEXT4, 205, 230,144, 144, 0,0},
- { TEXT_CreateIndirect, "富", GUI_ID_TEXT5, 405, 230,144, 144, 0,0},
- { TEXT_CreateIndirect, "富", GUI_ID_TEXT6, 605, 230,144, 144, 0,0}
- };
-
- /*
- *********************************************************************************************************
- * 函 数 名: PaintDialog
- * 功能说明: 对话框重绘函数
- * 形 参:pMsg 消息指针
- * 返 回 值: 无
- *********************************************************************************************************
- */
- void PaintDialog(WM_MESSAGE * pMsg)
- {
- // WM_HWIN hWin = pMsg->hWin;
-
- }
-
- /*
- *********************************************************************************************************
- * 函 数 名: 对话框初始化
- * 功能说明: 对话框初始化
- * 形 参: pMsg 消息指针
- * 返 回 值: 无
- *********************************************************************************************************
- */
- void InitDialog(WM_MESSAGE * pMsg)
- {
- WM_HWIN hWin = pMsg->hWin;
-
- //
- // 配置FrameWin
- //
- FRAMEWIN_SetFont(hWin,&GUI_Font32B_ASCII);
- FRAMEWIN_SetTextAlign(hWin,GUI_TA_VCENTER|GUI_TA_CENTER);
- FRAMEWIN_AddCloseButton(hWin, FRAMEWIN_BUTTON_RIGHT, 0);
- FRAMEWIN_AddMaxButton(hWin, FRAMEWIN_BUTTON_RIGHT, 1);
- FRAMEWIN_AddMinButton(hWin, FRAMEWIN_BUTTON_RIGHT, 2);
- FRAMEWIN_SetTitleHeight(hWin,35);
-
- /* 外部的7种字体在文件控件TEXT和按钮控件BUTTON中都使用了,具体调用方法如下,
- 跟使用emWin自带的字体是一样的。*/
- //
- // 按钮的字体是4倍抗锯齿,144点阵
- //
- BUTTON_SetFont(WM_GetDialogItem(hWin,GUI_ID_BUTTON0),&GUI_FontFontSongA144);
-
- //
- // 分别用16点阵,32点阵和72点阵字体显示 安富莱电子 五个字。
- //
- TEXT_SetTextColor(WM_GetDialogItem(hWin,GUI_ID_TEXT0), GUI_RED);
- TEXT_SetFont(WM_GetDialogItem(hWin,GUI_ID_TEXT0),&GUI_FontFontSong16);
- TEXT_SetTextColor(WM_GetDialogItem(hWin,GUI_ID_TEXT1), GUI_GREEN);
- TEXT_SetFont(WM_GetDialogItem(hWin,GUI_ID_TEXT1),&GUI_FontFontSong32);
- TEXT_SetTextColor(WM_GetDialogItem(hWin,GUI_ID_TEXT2), GUI_BLUE);
- TEXT_SetFont(WM_GetDialogItem(hWin,GUI_ID_TEXT2),&GUI_FontFontSong72);
-
- //
- // 分别用144点阵汉字,144点阵的扩展模式且4倍抗锯齿汉字,144点阵的4倍抗锯齿汉字和
- // 144点阵的扩展模式且带边框汉字。
- //
- TEXT_SetFont(WM_GetDialogItem(hWin,GUI_ID_TEXT3),&GUI_FontFontSong144);
- TEXT_SetFont(WM_GetDialogItem(hWin,GUI_ID_TEXT4),&GUI_FontFontSongExA144);
- TEXT_SetFont(WM_GetDialogItem(hWin,GUI_ID_TEXT5),&GUI_FontFontSongA144);
- TEXT_SetFont(WM_GetDialogItem(hWin,GUI_ID_TEXT6),&GUI_FontFontSongExF144);
- }
-
- /*
- *********************************************************************************************************
- * 函 数 名: _cbCallback
- * 功能说明: 对话框回调函数
- * 形 参: pMsg 消息指针
- * 返 回 值: 无
- *********************************************************************************************************
- */
- static void _cbCallback(WM_MESSAGE * pMsg)
- {
- int NCode, Id;
- WM_HWIN hWin = pMsg->hWin;
- switch (pMsg->MsgId)
- {
- case WM_PAINT:
- PaintDialog(pMsg);
- break;
-
- case WM_INIT_DIALOG:
- InitDialog(pMsg);
- break;
-
- case WM_KEY:
- switch (((WM_KEY_INFO*)(pMsg->Data.p))->Key)
- {
- case GUI_KEY_ESCAPE:
- GUI_EndDialog(hWin, 1);
- break;
- case GUI_KEY_ENTER:
- GUI_EndDialog(hWin, 0);
- break;
- }
- break;
-
- case WM_NOTIFY_PARENT:
- Id = WM_GetId(pMsg->hWinSrc);
- NCode = pMsg->Data.v;
- switch (Id)
- {
- case GUI_ID_OK:
- if(NCode==WM_NOTIFICATION_RELEASED)
- GUI_EndDialog(hWin, 0);
- break;
-
- case GUI_ID_CANCEL:
- if(NCode==WM_NOTIFICATION_RELEASED)
- GUI_EndDialog(hWin, 0);
- break;
-
- }
- break;
-
- default:
- WM_DefaultProc(pMsg);
- }
- }
-
- /*
- *********************************************************************************************************
- * 函 数 名: MainTask
- * 功能说明: GUI主函数
- * 形 参: 无
- * 返 回 值: 无
- *********************************************************************************************************
- */
- void MainTask(void)
- {
- /* 初始化 */
- GUI_Init();
-
- WM_MULTIBUF_Enable(1);
-
- /* 使能UTF-8编码,这个是第3步中所说的问题,不必限制一定要放在这个位置,使用外部字体之前调用了即可 */
- GUI_UC_SetEncodeUTF8();
-
- /* 调用此函数会自动的刷新桌面窗口 */
- WM_SetDesktopColor(GUI_WHITE);
-
- /* 创建对话框 */
- GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), &_cbCallback, 0, 0, 0);
-
- while(1)
- {
- GUI_Delay(10);
- }
- }
复制代码 通过上面的代码就实现了这7种字体的显示,具体效果可以看实验例程说明。
第5步:这个是最重要的一步,很多初学者显示汉字失败就是因为这一步了。
修改汉字显示所在的源文件,即MainTask.c文件为UTF-8编码,并不是修改FontCvt生成的C文件为UTF-8编码,因为FontCvt软件生成的C文件已经是UTF-8编码了。也就是说哪个文件用到这种汉字显示了,哪个文件就修改编码类型为UTF-8,只有这样,IAR将这些汉字的编码识别出来,要不识别出来的汉字编码与FontCvt生成字体的编码类型不匹配,从而无法正确显示。
修改编码类型也比较容易,使用IAR的话,不要使用记事本来修改了(为什么不可以使用,在22.5小节有讲解),IAR编辑器支持编码类型的修改。
IAR编码方面的小知识: 默认情况下,IAR创建的工程都是System编码,也就是你的电脑系统是什么编码类型,使用IAR创建的.C和.H文件就是什么编码类型,一般大陆都是用的GBK编码,查看电脑系统编码类型可以通过:单击开始->所有程序->附件->命令提示符,打开命令提示符,输入chcp,然后点击键盘的回车键。 这里的936就是代表GBK编码。而IAR的编码设置在这里,点击菜单Tools->Options,弹出如下窗口 默认的编码类型是System。
在IAR编译器中如何查看.C和.H文件的编码类型,又如何修改呢?查看编码类型可以任意打开一个文件,然后查看右下角。
这里打开的就是一个中文简体,GB2312编码,GBK向下是完全兼容GB2312的。修改单个.C和.H文件的编码类型也比较简单,这里我们需要修改MainTask.c文件的编码类型为UTF-8,直接在MainTask.c文件里面右击鼠标,选择CharacterEncoding->Convert to UTF-8。
设置后就可以看到右下角已经修改为UTF-8了。
此时就可以全编译工程并下载例子到开发板进行测试了。 |