OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3928|回复: 4

探索者F407关于EMWIN实验23 汉字显示(FLASH外置字库)问题

[复制链接]

12

主题

27

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
241
金钱
241
注册时间
2016-9-21
在线时间
59 小时
发表于 2016-10-18 12:29:20 | 显示全部楼层 |阅读模式
我在学习实验23时,开始对GUICharPEx.c、GUI_FontHZ12.c、GUI_FontHZ16.c、GUI_FontHZ24.c和GUI_UC_EncodeNone.c五个文件分析。
有几个事项共享,请大拿确认验证:
1)字体结构体,以GUI_FontHZ12.c为例(另外2个同理修改)。源码中的 0xA1A1 我理解是GB2312,而字库是GBK936。为了全面支持GBK936字库应该修改(第1个汉字丂是0x8140,原版软件是无法显示的)
//GB2312编码范围是 0xA1A1 - 0xFEFE
//GBK 采用双字节表示,总体编码范围为 8140-FEFE
//所以这里面的参数应该是8140-FEFE
//GUI_CONST_STORAGE GUI_FONT_PROP GUI_FontHZ12_PropHZ = {
//      0xA1A1,
//      0xFFFF,
//      &GUI_FontHZ12_CharInfo[1],
//      (void *)0,
//};

GUI_CONST_STORAGE GUI_FONT_PROP GUI_FontHZ12_PropHZ = {
      0x8140,
      0xFEFE,
      &GUI_FontHZ12_CharInfo[1],
      (void *)0,
};
//结构体GUI_FONT_PROP定义了字体多个编码区域的地址和信息,因为一个字体可能存在多个编码区域,每个区域都有各自的信息,字体高度宽区可能都不一样。
//区域第一个字符的编码
//区域最后一个字符的编码
//属于该区域字符的字体信息
//指向字体下一个编码区域

//0x0000, //ASCII12字库第一个字符的编码
//0x007F, //ASCII12字库最后一个字符的编码
//GUI_CONST_STORAGE GUI_FONT_PROP GUI_FontHZ12_PropASC = {
//      0x0000,
//      0x007F,
//      &GUI_FontHZ12_CharInfo[0],
//      (void GUI_CONST_STORAGE *)&GUI_FontHZ12_PropHZ,
//};
//改成0x7F00,是因为GUIPROP_X_GetCharDistX中,我将高字节和低字节对调了。为何对调,见GUIPROP_X_GetCharDistX
GUI_CONST_STORAGE GUI_FONT_PROP GUI_FontHZ12_PropASC = {
      0x0000,
      0x7F00,
      &GUI_FontHZ12_CharInfo[0],
      (void GUI_CONST_STORAGE *)&GUI_FontHZ12_PropHZ,
};
2)修改GUI_UC_EncodeNone.c,之前也是只支持GB2312;4处修改
static U16 _GetCharCode(const char GUI_UNI_PTR * s)
{
    if((*s) >= 0X81)
    //if((*s) > 0XA0)
static int _GetCharSize(const char GUI_UNI_PTR * s)
{
    GUI_USE_PARA(s);
    if((*s) >= 0X81)
    //if((*s) > 0XA0)
static int _CalcSizeOfChar(U16 Char)
{
    GUI_USE_PARA(Char);
    if(Char >=0X8140)
    //if(Char >0XA0A0)
static int _Encode(char *s, U16 Char)
{
    if(Char >=0X8140)
    //if(Char >0XA0A0)
3)修改GUICharPEx.c
//比如何字,编译成GBK码16Bit数据是0xCEBA,而字库和字体配置是0xBACE(高低字节反过来了)

int GUIPROP_X_GetCharDistX(U16P c)
{
      const GUI_FONT_PROP GUI_UNI_PTR * pProp = GUI_pContext->pAFont->p.pProp;

    c=(((c%256)<<8)+(c/256));//何 0xBACE,但是C=0xCEBA 要转换!这样C和 pProp->First、pProp->Last相匹配

void GUIPROP_X_DispChar(U16P c)
{   
    int BytesPerLine;
    GUI_DRAWMODE DrawMode = GUI_pContext->TextMode;
    const GUI_FONT_PROP GUI_UNI_PTR *pProp = GUI_pContext->pAFont->p.pProp;
      c=(((c%256)<<8)+(c/256));//何 0xBACE,但是C=0xCEBA 要转换!这样C和 pProp->First、pProp->Last相匹配
    //搜索定位字库数据信息
    for (; pProp; pProp = pProp->pNext)                                         
    {
        if ((c >= pProp->First) && (c <= pProp->Last)) break;
    }
        //GUI_GetDataFromMemory中会转换,所以这里要还原。GUI_GetDataFromMemory代码优化,下面这行代码就可以删除
        c=(((c%256)<<8)+(c/256));

最终,之前无法显示丂(GBK936 第一个汉字),现在可以了
//EMWINDEMO任务
void emwindemo_task(void *pdata)
{
    GUI_CURSOR_Show();
    GUI_SetBkColor(GUI_BLUE);
    GUI_Clear();
    GUI_SetColor(GUI_RED);
    GUI_SetFont(&GUI_FontHZ12);
    GUI_DispStringAt("12号字体:丂广州星翼电子 ALIENTEK! ",10,10);
    GUI_SetFont(&GUI_FontHZ16);
    GUI_DispStringAt("16号字体:丂广州星翼电子 ALIENTEK!",10,30);
    GUI_SetFont(&GUI_FontHZ24);
    GUI_DispStringAt("24号字体:丂广州星翼电子 ALIENTEK!",10,50);


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

12

主题

27

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
241
金钱
241
注册时间
2016-9-21
在线时间
59 小时
 楼主| 发表于 2016-10-18 12:30:44 | 显示全部楼层
回复 支持 反对

使用道具 举报

头像被屏蔽

345

主题

422

帖子

0

精华

禁止访问

积分
1250
金钱
1250
注册时间
2016-10-14
在线时间
33 小时
发表于 2016-10-18 13:19:41 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

5

主题

62

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
425
金钱
425
注册时间
2016-3-9
在线时间
74 小时
发表于 2017-3-3 12:16:49 | 显示全部楼层
楼主你好,我有一个疑问,GBK编码的高低字节需要调换,那么,之前用GB2312的时候没有调换可以正常显示
回复 支持 反对

使用道具 举报

5

主题

62

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
425
金钱
425
注册时间
2016-3-9
在线时间
74 小时
发表于 2017-3-3 12:44:47 | 显示全部楼层
本帖最后由 taoking_opendev 于 2017-3-3 12:49 编辑

你这个修改麻烦了,其实只需要修改GUI_FontHZ12.c、GUI_FontHZ16.c、GUI_FontHZ24.c文件中的
GUI_CONST_STORAGE GUI_FONT_PROP GUI_FontHZ12_PropHZ = {
      0x4081,
      0xFEFE,
      &GUI_FontHZ12_CharInfo[1],
      (void *)0,
};
即将此结构体的第一个成员变量由0x8140替换为0x4081,第二个成员变量为0xFEFE即可,另外两个文件GUI_FontHZ16.c、GUI_FontHZ24.c中相对应的变量做类似更改即可。GUI_UC_EncodeNone.c文件按照你上面的修改就行。原子的EMWIN实验23 汉字显示(FLASH外置字库)中有一些错误和需要改进地方
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 02:34

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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