[EMWIN] 多国语言实现方法---csv文件实现

2 篇文章 0 订阅

目录

前期准备:

第一步:生成csv文件

第二步: 生成c文件

第三步: 生成对语言字库:

第四步:把文件加载到模拟器中

第五步:多语言环境准备

第六步: 使用函数进行调用

附录:


 

前期准备:

PC: win7X64 vs2013 微软自带的微软雅黑字体

emwin 相关:emwin5.42模拟器,emwin5.42英文手册, Bin2C.exe FontCvt.exe 

 

第一步:生成csv文件

excel中的内容:

 

 ①新建txt文件,另存为utf-8格式; ②复制excel中的内容到txt中,将 制表符 替换为 英文的逗号 ,并保存 ; ③将txt文件更改后缀名为 csv;

④得到如下文件(tmp1.csv):

 

第二步: 生成c文件

使用emwin的 Bin2C.exe 软件,将上一步的 tmp1.csv 装换为 tmp1.c 文件;

其内容为一个大数组:

bin2c.exe : 下载地址: http://dl.pconline.com.cn/download/766925-1.html

 

第三步: 生成对语言字库:

①记事本打开 tmp1.csv ,且另存为文件为Unicode格式的 tmp1.txt 文件;

②使用 tmp1.txt 文件通过FontCvt.exe 生成字库请详见安富莱教程: http://bbs.armfly.com/read.php?tid=6481

 ③通过②步骤得到 WRYHLight19_10_4bpp.c 字库文件.

 

第四步:把文件加载到模拟器中

 

① 点击打开 tmp1.c 之后, 将 actmp1 数组改为静态数组,且定义两个全局变量:

这里需要注意下: 使用 const 的数组,在后续步骤会使emwin奔溃,可能是emwin需要修改原数组.

 

②在数组最后增加函数:

 

 

第五步:多语言环境准备

① 复制文件 tmp1.xlsx 到一个新的文件   有序号的tmp1.xlsx, 增加序号,等会使用多语言的时候有用.

②在 MainTas.c 中将①中的序号定义为 enum 类型

③多语言宏定义

根据excel定义三个语言的宏定义

 

④初始化多语言使用环境

三个函数:

使用多语言注册 emwin的 utf-8 : GUI_UC_SetEncodeUTF8();

然后就是之前多语言的函数 : void getLanguageInfo(unsigned char** pLan, unsigned int* pLanCnt)

最后是导入多语言到emwin中 : int GUI_LANG_LoadCSV(char * pFileData, U32 FileSize);

 

 

GUI_LANG_LoadCSV 的相关内容在 emwin5.42 手册的 P1135 ,使用函数  GUI_LANG_LoadCSV 

 注意:在这里如果使用函数GUI_LANG_LoadCSV的 pFileData  为const 类型,会使emwin 奔溃.切记!!!

 

第六步: 使用函数进行调用

使用 GUI_LANG_GetTextEx 进行调用emwin中的多语言数据.

GUI_LANG_GetTextEx 函数相关见手册 P1137.

 

附录:

1.文中源码和相关文件,由于软件有版权的问题,请自己自行百度,或者在st的固件库文件中有:

 

2.代码地址: 链接:http://pan.baidu.com/s/1bpItz0j 密码:uedt

3.官方例程: http://bbs.armfly.com/read.php?tid=5681 (已失效)

 

 

 

 

 

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
v1.11 (08/14/2012) 1. 增加注册年限选择。 v1.10 (06/26/2012) 1. 精简字库检索表。 2. 增加 GBK 字库输出。 3. 增加一种点阵数据存储格式(只存有效像素数据--not fixed, 不支持MBCS编码格式的中日韩), 对泰文,缅甸文等特殊语种显示非常便捷。 v1.09 (06/15/2012) 1. 增加输出 C 语言(数组) 字体格式。 V1.08 (05/17/2012) 1. 增加了两个版本(免费和试用版) 免费版 只对 16点阵有效。 试用版 对所有点阵有效,但是会缺部分字符。 2. 增加热键功能。 3. 修改了多国语言生成.h文件时,start 与 end 不匹配的bug。 4. 完善文档《GuiTool 使用说明》, 增加更多图解说明。 文档下载地址: http://ishare.iask.sina.com.cn/f/24472766.html v1.07 (05/02/2012) 1. 修改注册方式(改为文件)。 2. 增加bdf格式编码过滤功能,主要是为了支持 MTK 手机点阵字库。 3. 增加xp控件属性。 4. 增加扫描模式图解。 5. 修改了 bdf 2 bin 的一个bug。(选择输出位图时,会输出n个位图文件) 6. 修改了 BDF 文件中当字符显示宽度为0,存位图(所有字符存一张图片)失败的错误。 v1.06 (04/10/2012) 1. 增加系统字体支持,操作更简便,快捷。 枚举所有已安装系统字体,直接选择即可。 v1.05 (03/24/2012) Fontmaker(点阵字库) 1. 修正了字符对齐问题。 2. 增加了单个字符或多个字符输出成位图文件设定。 3. 完善了阿拉伯文字库(unicode 字库有效)。 4. 增加自定义字符功能(unicode 字库有效)。 Multi-language(多国语言) 1. 增加输出编码格式 (mbcs, utf16-lb, utf8)设置 2. 增加数组格式输出。 Image Manager(图像管理) 1. 该页为新增功能,支持图片图像的数据转换。主要应用在做产品logo图片方面。 V1.04 (07/16/2011) 1. 增加了一个字符串mbcs2unicode(内码转统一码)的功能。 (支持转:U16-LE, U16-BE, UTF8) V1.03 (07/05/2011) 1. 修改了 Example 中点阵字库解析源码,更加便于移植。(基本做到只需修改font_file.c 即可) 2. 修改了内码(MBCS)字库点阵信息读取的一个错误。 3. 增加了多语言支持(简中,英文),还有待完善。。。 V1.02 (07/01/2011) 1. FontMaker V2.03 a. 增加字符宽高比调节(HorR & VerR) b. 增加对*.ttc 字库的支持。 c. 增加bdf(*.bdf)文件格式转Simple Unicode编码格式的bin文件。 V1.01 (06/29/2011) 1. FontMaker V2.02 a. 增加了 Simple Unicode功能。(适合小字库) b. 增加了 “扫描方向及反显”设置。 2. Multi-Language V1.01 a. 修改了除 office 2000 外,其它不能支持的问题。 V1.00: (2007-2011) 1. 继承 FontMaker V2.01 的所有功能。 2. 增加了一个 Multi-Languge V1.00 的打包转换功能。 FontMaker 基本功能: 1.支持所有 windows 字符集:CP932(日文Shift-JIS)CP936(简体中文GBK)CP949(韩文)CP950(繁体中文 Big5),CP874(泰文),CP1250(中欧)CP1251(西里尔文),CP1252(西欧--"拉丁文I"),CP1253(希腊文), CP1254(土耳其文),CP1255(希伯来文),CP1256(阿拉伯文),CP1257(波罗的海文),CP1258(越南) 2.支持非等宽字库。 3.支持BIN,TXT,BMP,BDF 文件输出。 4.支持unicode字库输出,即可以做到在一个窗口中同时显示多国语言(文字) 5.支持单个字符编辑,预览(所见即所得)。 6.支持字库文件和输出路径记忆功能. 7. 支持从bdf格式转换自定义字库(bin文件)格式。
好的,首先我们需要使用Emwin中的窗口控件来创建数字键盘和EDIT工具来显示输入的数值。 首先创建一个窗口控件来容纳数字键盘。在窗口中绘制0-9的数字键盘。可以使用BUTTON控件或者TEXT控件来实现每个数字键。 接下来,创建一个EDIT控件来实时显示输入的数值。可以使用WM_HEDIT_Create函数创建一个水平方向的EDIT控件。 接着,为每个数字键添加按键响应函数,将数字键的值添加到EDIT控件中。可以使用WM_HEDIT_AddChar函数将字符添加到EDIT控件中。 最后,将数字键盘和EDIT控件添加到窗口中并显示窗口即可。 以下是示例代码: ``` #include "DIALOG.h" #define ID_WINDOW_0 (GUI_ID_USER + 0x00) #define ID_BUTTON_0 (GUI_ID_USER + 0x01) #define ID_BUTTON_1 (GUI_ID_USER + 0x02) #define ID_BUTTON_2 (GUI_ID_USER + 0x03) #define ID_BUTTON_3 (GUI_ID_USER + 0x04) #define ID_BUTTON_4 (GUI_ID_USER + 0x05) #define ID_BUTTON_5 (GUI_ID_USER + 0x06) #define ID_BUTTON_6 (GUI_ID_USER + 0x07) #define ID_BUTTON_7 (GUI_ID_USER + 0x08) #define ID_BUTTON_8 (GUI_ID_USER + 0x09) #define ID_BUTTON_9 (GUI_ID_USER + 0x0A) #define ID_EDIT_0 (GUI_ID_USER + 0x0B) static WM_HWIN hEdit; static void _cbWindow(WM_MESSAGE *pMsg) { switch (pMsg->MsgId) { case WM_PAINT: GUI_SetBkColor(GUI_BLACK); GUI_Clear(); break; default: WM_DefaultProc(pMsg); break; } } static void _cbButton(WM_MESSAGE *pMsg) { switch (pMsg->MsgId) { case WM_PAINT: GUI_DrawRect(&pMsg->hWin->Rect); break; case WM_NOTIFY_PARENT: switch (pMsg->Data.v) { case WM_NOTIFICATION_CLICKED: if (pMsg->hWin == WM_GetDialogItem(pMsg->hWin, ID_BUTTON_0)) { WM_HEDIT_AddChar(hEdit, '0'); } else if (pMsg->hWin == WM_GetDialogItem(pMsg->hWin, ID_BUTTON_1)) { WM_HEDIT_AddChar(hEdit, '1'); } else if (pMsg->hWin == WM_GetDialogItem(pMsg->hWin, ID_BUTTON_2)) { WM_HEDIT_AddChar(hEdit, '2'); } else if (pMsg->hWin == WM_GetDialogItem(pMsg->hWin, ID_BUTTON_3)) { WM_HEDIT_AddChar(hEdit, '3'); } else if (pMsg->hWin == WM_GetDialogItem(pMsg->hWin, ID_BUTTON_4)) { WM_HEDIT_AddChar(hEdit, '4'); } else if (pMsg->hWin == WM_GetDialogItem(pMsg->hWin, ID_BUTTON_5)) { WM_HEDIT_AddChar(hEdit, '5'); } else if (pMsg->hWin == WM_GetDialogItem(pMsg->hWin, ID_BUTTON_6)) { WM_HEDIT_AddChar(hEdit, '6'); } else if (pMsg->hWin == WM_GetDialogItem(pMsg->hWin, ID_BUTTON_7)) { WM_HEDIT_AddChar(hEdit, '7'); } else if (pMsg->hWin == WM_GetDialogItem(pMsg->hWin, ID_BUTTON_8)) { WM_HEDIT_AddChar(hEdit, '8'); } else if (pMsg->hWin == WM_GetDialogItem(pMsg->hWin, ID_BUTTON_9)) { WM_HEDIT_AddChar(hEdit, '9'); } break; default: break; } break; default: BUTTON_Callback(pMsg); break; } } void MainTask(void) { GUI_Init(); WM_SetCreateFlags(WM_CF_MEMDEV); WM_SetDesktopColor(GUI_BLACK); WM_SetCallback(WM_HBKWIN, _cbWindow); WM_CreateWindowAsChild(0, 0, LCD_GetXSize(), LCD_GetYSize(), WM_HBKWIN, WM_CF_SHOW, _cbWindow, 0); WM_CreateWindow(10, 10, 220, 280, WM_CF_SHOW, _cbWindow, 0); hEdit = WM_HEDIT_CreateEx(10, 10, 200, 40, 0, WM_CF_SHOW, 0, ID_EDIT_0, 10); WM_CreateWindowAsChild(10, 60, 60, 60, WM_GetDesktopWindowEx(0), WM_CF_SHOW, _cbButton, 0); WM_CreateWindowAsChild(80, 60, 60, 60, WM_GetDesktopWindowEx(0), WM_CF_SHOW, _cbButton, 0); WM_CreateWindowAsChild(150, 60, 60, 60, WM_GetDesktopWindowEx(0), WM_CF_SHOW, _cbButton, 0); WM_CreateWindowAsChild(10, 130, 60, 60, WM_GetDesktopWindowEx(0), WM_CF_SHOW, _cbButton, 0); WM_CreateWindowAsChild(80, 130, 60, 60, WM_GetDesktopWindowEx(0), WM_CF_SHOW, _cbButton, 0); WM_CreateWindowAsChild(150, 130, 60, 60, WM_GetDesktopWindowEx(0), WM_CF_SHOW, _cbButton, 0); WM_CreateWindowAsChild(10, 200, 60, 60, WM_GetDesktopWindowEx(0), WM_CF_SHOW, _cbButton, 0); WM_CreateWindowAsChild(80, 200, 60, 60, WM_GetDesktopWindowEx(0), WM_CF_SHOW, _cbButton, 0); WM_CreateWindowAsChild(150, 200, 60, 60, WM_GetDesktopWindowEx(0), WM_CF_SHOW, _cbButton, 0); BUTTON_SetText(WM_GetDialogItem(WM_GetDesktopWindowEx(0), ID_BUTTON_0), "0"); BUTTON_SetText(WM_GetDialogItem(WM_GetDesktopWindowEx(0), ID_BUTTON_1), "1"); BUTTON_SetText(WM_GetDialogItem(WM_GetDesktopWindowEx(0), ID_BUTTON_2), "2"); BUTTON_SetText(WM_GetDialogItem(WM_GetDesktopWindowEx(0), ID_BUTTON_3), "3"); BUTTON_SetText(WM_GetDialogItem(WM_GetDesktopWindowEx(0), ID_BUTTON_4), "4"); BUTTON_SetText(WM_GetDialogItem(WM_GetDesktopWindowEx(0), ID_BUTTON_5), "5"); BUTTON_SetText(WM_GetDialogItem(WM_GetDesktopWindowEx(0), ID_BUTTON_6), "6"); BUTTON_SetText(WM_GetDialogItem(WM_GetDesktopWindowEx(0), ID_BUTTON_7), "7"); BUTTON_SetText(WM_GetDialogItem(WM_GetDesktopWindowEx(0), ID_BUTTON_8), "8"); BUTTON_SetText(WM_GetDialogItem(WM_GetDesktopWindowEx(0), ID_BUTTON_9), "9"); while (1) { GUI_Delay(100); } } ``` 这个示例程序中,我们使用了BUTTON控件来实现数字键盘,使用了WM_HEDIT控件来实时显示输入的数值。在_cbButton回调函数中,我们为每个数字键添加了按键响应函数,将数字键的值添加到EDIT控件中。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值