搜索
bottom↓
回复: 37

emwin 汉字显示方法

  [复制链接]

出0入0汤圆

发表于 2013-8-9 18:02:39 | 显示全部楼层 |阅读模式
本帖最后由 sea_star 于 2013-8-9 18:11 编辑

这几天想做个MP3播放器,用到了中文,搞了一天,增加俩个文件,放在库文件目录下,字库是我从文件加载的,现在共享。
/*
*********************************************************************************************************
*                                             uC/GUI V3.98
*                        Universal graphic software for embedded applications
*
*                       (c) Copyright 2002, Micrium Inc., Weston, FL
*                       (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
*
*              µC/GUI is protected by international copyright laws. Knowledge of the
*              source code may not be used to write a similar product. This file may
*              only be used in accordance with a license and should not be redistributed
*              in any way. We appreciate your understanding and fairness.
*
----------------------------------------------------------------------
File        : GUI_UC_EncodeNone.c
Purpose     : Encoding routines for non unicode systems (default)
---------------------------END-OF-HEADER------------------------------
*/

#include "GUI_Private.h"

/*********************************************************************
*
*       Static code
*
**********************************************************************
*/
/*********************************************************************
*
*       _GetCharCode
*
* Purpose:
*   Return the UNICODE character code of the current character.
*/
static U16 _GetCharCode(const char GUI_UNI_PTR * s) {

if((*s) > 0xA0)
    return *(const U16 GUI_UNI_PTR *)s;

  return *(const U8 GUI_UNI_PTR *)s;
}

/*********************************************************************
*
*       _GetCharSize
*
* Purpose:
*   Return the number of bytes of the current character.
*/
static int _GetCharSize(const char GUI_UNI_PTR * s) {
  GUI_USE_PARA(s);
  if((*s) > 0xA0)                return 2;
  return 1;
}

/*********************************************************************
*
*       _CalcSizeOfChar
*
* Purpose:
*   Return the number of bytes needed for the given character.
*/
static int _CalcSizeOfChar(U16 Char) {
  GUI_USE_PARA(Char);
  if(Char > 0xA0A0)                return 2;
  return 1;
}

/*********************************************************************
*
*       _Encode
*
* Purpose:
*   Encode character into 1/2/3 bytes.
*/
static int _Encode(char *s, U16 Char) {

  if(Char > 0xA0A0)
  {
    *((U16 *)s) = (U16)(Char);
    return 2;
  }
  *s = (U8)(Char);
  return 1;
}

/*********************************************************************
*
*       Static data
*
**********************************************************************
*/
/*********************************************************************
*
*       _API_Table
*/
const GUI_UC_ENC_APILIST GUI_UC_None = {
  _GetCharCode,     /*  return character code as U16 */
  _GetCharSize,     /*  return size of character: 1 */
  _CalcSizeOfChar,  /*  return size of character: 1 */
  _Encode           /*  Encode character */
};
//const GUI_UC_ENC_APILIST GUI__API_TableNone = {
//  _GetCharCode,     /*  return character code as U16 */
//  _GetCharSize,     /*  return size of character: 1 */
//  _CalcSizeOfChar,  /*  return size of character: 1 */
//  _Encode           /*  Encode character */
//};
/*********************************************************************
*
*       Exported code
*
**********************************************************************
*/
/*********************************************************************
*
*       GUI_UC_SetEncodeNone
*/
// void GUI_UC_SetEncodeNone(void) {
//   #if GUI_SUPPORT_UNICODE
//     GUI_LOCK();
//     GUI_Context.pUC_API = &GUI_UC_None;
//     GUI_UNLOCK();
//   #endif
// }

/*************************** End of file ****************************/
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     
#include <stddef.h>           /* needed for definition of NULL */
#include "GUI_Private.h"
#include <string.h>
/*********************************************************************
*
*       Static code
*
**********************************************************************
*/
//×ÖÄ£Êý¾ÝµÄÔÝ´æÊý×é,ÒÔµ¥¸ö×ÖÄ£µÄ×î´ó×Ö½ÚÊýΪÉ趨ֵ
#define BYTES_PER_FONT              128
static U8 GUI_FontDataBuf[BYTES_PER_FONT];
extern unsigned char                *_Hzk_16;
extern unsigned char                *_Asc_16;
//´ÓÍⲿ´æ´¢Æ÷È¡µÃ×ÖÄ£Êý¾Ý
static void GUI_GetDataFromMemory(const GUI_FONT_PROP GUI_UNI_PTR *pProp, U16P c)
{
    U16 BytesPerFont;
    U32 oft;
    char *font = (char *)pProp->paCharInfo->pData;
    BytesPerFont = GUI_pContext->pAFont->YSize * pProp->paCharInfo->BytesPerLine; //ÿ¸ö×ÖÄ£µÄÊý¾Ý×Ö½ÚÊý
    if (BytesPerFont > BYTES_PER_FONT){BytesPerFont = BYTES_PER_FONT;}
    if (c < 0x80)                                                                       //Ó¢ÎÄ×Ö·ûµØÖ·Æ«ÒÆËã·¨
    {
             oft = c * BytesPerFont;
    }
    else                                                                          
    {
            oft = ((((c >> 8) - 0xA1)) + ((c & 0xFF) - 0xA1) * 94l) * BytesPerFont;                 //ÖÐÎÄ×Ö·ûµØÖ·Æ«ÒÆËã·¨°üÀ¨·ûºÅ
    }
        if (font[0] == 'a')
        {
                memcpy(GUI_FontDataBuf, _Asc_16 + oft, BytesPerFont);                       
        }
        else
                memcpy(GUI_FontDataBuf, _Hzk_16 + oft, BytesPerFont);               
}
/*********************************************************************
*
*       Public code
*
**********************************************************************
*/
/*********************************************************************
*
*       GUIPROP_DispChar
*
* Purpose:
*   This is the routine that displays a character. It is used by all
*   other routines which display characters as a subroutine.
*/
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;
    //ËÑË÷¶¨Î»×Ö¿âÊý¾ÝÐÅÏ¢
    for (; pProp; pProp = pProp->pNext)                                         
    {
        if ((c >= pProp->First) && (c <= pProp->Last))
                                {
                                                break;
                                }
    }
    if (pProp)
    {
        GUI_DRAWMODE OldDrawMode;
        const GUI_CHARINFO GUI_UNI_PTR * pCharInfo = pProp->paCharInfo;
        GUI_GetDataFromMemory(pProp, c);//È¡³ö×ÖÄ£Êý¾Ý
        BytesPerLine = pCharInfo->BytesPerLine;               
        OldDrawMode  = LCD_SetDrawMode(DrawMode);
        LCD_DrawBitmap(GUI_pContext->DispPosX, GUI_pContext->DispPosY,
                       pCharInfo->XSize, GUI_pContext->pAFont->YSize,
                       GUI_pContext->pAFont->XMag, GUI_pContext->pAFont->YMag,
                       1,     /* Bits per Pixel */
                       BytesPerLine,
                       &GUI_FontDataBuf[0],
                       &LCD_BKCOLORINDEX
                       );
        /* Fill empty pixel lines */
        if (GUI_pContext->pAFont->YDist > GUI_pContext->pAFont->YSize)
        {
            int YMag = GUI_pContext->pAFont->YMag;
            int YDist = GUI_pContext->pAFont->YDist * YMag;
            int YSize = GUI_pContext->pAFont->YSize * YMag;
            if (DrawMode != LCD_DRAWMODE_TRANS)
            {
                LCD_COLOR OldColor = GUI_GetColor();
                GUI_SetColor(GUI_GetBkColor());
                LCD_FillRect(GUI_pContext->DispPosX, GUI_pContext->DispPosY + YSize,
                             GUI_pContext->DispPosX + pCharInfo->XSize,
                             GUI_pContext->DispPosY + YDist);
                GUI_SetColor(OldColor);
            }
        }
        LCD_SetDrawMode(OldDrawMode); /* Restore draw mode */
//            if (!GUI_MoveRTL)
                GUI_pContext->DispPosX += pCharInfo->XDist * GUI_pContext->pAFont->XMag;
    }
}
/*********************************************************************
*
*       GUIPROP_GetCharDistX
*/
int GUIPROP_X_GetCharDistX(U16P c)
{
    const GUI_FONT_PROP GUI_UNI_PTR * pProp = GUI_pContext->pAFont->p.pProp;  
    for (; pProp; pProp = pProp->pNext)                                         
    {
        if ((c >= pProp->First) && (c <= pProp->Last))break;
    }
    return (pProp) ? (pProp->paCharInfo)->XSize * GUI_pContext->pAFont->XMag : 0;
}

GUI_CONST_STORAGE GUI_CHARINFO GUI_FontHZ16_CharInfo[2] =
{   
    {  8,    8,  1, (void *)"a"},      
    {  16,  16,  2, (void *)"b"},           
};

GUI_CONST_STORAGE GUI_FONT_PROP GUI_FontHZ16_PropHZ = {
      0xA1A1,
      0xFFFF,
      &GUI_FontHZ16_CharInfo[1],
      (void *)0,
};

GUI_CONST_STORAGE  GUI_FONT_PROP GUI_FontHZ16_PropASC = {
      0x0000,
      0x007F,
      &GUI_FontHZ16_CharInfo[0],
      (void GUI_CONST_STORAGE *)&GUI_FontHZ16_PropHZ,
};

GUI_CONST_STORAGE  GUI_FONT GUI_FontHZ16 =
{
      GUI_FONTTYPE_PROP_USER,
      16,
      16,
      1,  
      1,  
      (void GUI_CONST_STORAGE *)&GUI_FontHZ16_PropASC
};

GUI_CONST_STORAGE  GUI_FONT GUI_FontHZ16x2 =
{
      GUI_FONTTYPE_PROP_USER,
      16,
      16,
      2,  
      2,  
      (void GUI_CONST_STORAGE *)&GUI_FontHZ16_PropASC
};

在 gui_type.h 加
/*PROP_USER: chian */
#define GUI_FONTTYPE_PROP_USER       \
  GUIPROP_X_DispChar,             \
  GUIPROP_X_GetCharDistX,         \
  GUIMONO_GetFontInfo,          \
  GUIMONO_IsInFont,             \
  (GUI_GETCHARINFO *)0,         \
  (tGUI_ENC_APIList*)0                                                                                                            
在 gui.h 加       
extern GUI_CONST_STORAGE GUI_FONT GUI_FontHZ12;
extern GUI_CONST_STORAGE GUI_FONT GUI_FontHZ16;
extern GUI_CONST_STORAGE GUI_FONT GUI_FontHZ16x2;     

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2013-8-9 23:56:17 | 显示全部楼层
楼主开源

出0入0汤圆

发表于 2013-8-10 16:28:38 | 显示全部楼层
不知道这种方法能否用在 EMWIN 5.20上,能否详细点

出0入0汤圆

 楼主| 发表于 2013-8-10 18:33:06 | 显示全部楼层
我就是在emwin5.20上用的

出0入0汤圆

发表于 2013-8-12 14:51:53 来自手机 | 显示全部楼层
mark……
顶一个…

出0入0汤圆

发表于 2013-9-4 21:08:20 | 显示全部楼层
楼主无私奉献,,学习了!顶!

出0入0汤圆

发表于 2013-9-5 08:06:33 | 显示全部楼层
请问楼主,你这个是emWin,还是uCGUI3.98的版本?或者说你这种方法也能够在emWin下面实现吗?

出0入0汤圆

发表于 2013-9-5 08:46:42 | 显示全部楼层
先mark,回去试试

出0入0汤圆

发表于 2013-9-9 17:49:21 | 显示全部楼层
收藏了,以后研究下,想弄这个很久了.

出0入0汤圆

发表于 2013-9-9 18:29:44 | 显示全部楼层
mark一下1准备用

出0入0汤圆

发表于 2013-9-10 21:56:52 | 显示全部楼层
看了一下,这个不是在UCGUI3.xx时候的移植办法么,都说emWin只有库,没有源码,要修改源码,谁知试了试真的能用。。。
今天尝试了一下,真的可以用,哎,只怪自己以前没有去尝试,感谢楼主让我勇敢的去尝试

测试STemWin5.20,字库放到SD卡里面,显示效果如下:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2013-9-11 00:11:48 | 显示全部楼层
lz的播放器效果真赞

出0入0汤圆

发表于 2013-9-12 10:11:59 | 显示全部楼层
伤心病狂的MARK.

出0入0汤圆

发表于 2013-11-17 22:25:08 | 显示全部楼层
今天没白包宿,终于找到一个能使得例子了,万分感谢楼主的奉献

出0入0汤圆

发表于 2013-11-22 13:55:40 | 显示全部楼层
强烈的MARK一下

出0入0汤圆

发表于 2013-11-22 18:06:30 | 显示全部楼层
强烈的的感谢楼主啊

出100入101汤圆

发表于 2013-11-22 18:52:51 | 显示全部楼层
字库会不会太占FLASH?

出0入0汤圆

发表于 2013-12-8 20:32:18 | 显示全部楼层
很好 大部分系统都会在界面上用到中文 谢谢楼主分享

出0入0汤圆

发表于 2013-12-28 21:27:20 | 显示全部楼层
恩,现在显示汉字大体方法。这2天看了看。

1、外置字库,然后GBK 或者GB2312 之类的 解码 如楼主所说
2、分散加载内部flash
3、自制字库,utf8 转码之类的

由于自己半路出家。像楼主所用的那几个 文件,能否简单的解释下,说说下出处。现在是能用。但是不知道具体实现。很头疼···

出0入0汤圆

发表于 2014-1-4 17:12:11 | 显示全部楼层
感谢楼主的分享。

出0入0汤圆

发表于 2014-1-25 13:21:26 | 显示全部楼层
记号,多谢楼主分享

出0入0汤圆

发表于 2014-4-3 23:28:53 | 显示全部楼层
能上传一个工程文件吗

出0入0汤圆

发表于 2014-4-4 12:48:22 | 显示全部楼层

出0入0汤圆

发表于 2014-4-4 15:19:14 | 显示全部楼层
不错 点个赞

出100入101汤圆

发表于 2014-4-4 16:22:16 | 显示全部楼层
LZ,你说的“放在库文件目录下”,是指的字库文件么?字库文件如何生成?

出0入0汤圆

发表于 2014-4-8 08:54:44 | 显示全部楼层
先学习下

出0入0汤圆

发表于 2014-5-1 20:33:31 | 显示全部楼层
ok,可用

出0入90汤圆

发表于 2014-7-15 05:12:12 | 显示全部楼层
兄弟,今天弄外部汉字显示弄了好几个小时!还是没搞出来!查了几个小时的原因,最终定位到这个地方
int GUIPROP_X_GetCharDistX(U16P c)
void GUIPROP_X_DispChar(U16P c)

这两个函数,按照代码里面,应该是读取一个汉字对应的内码。c就是这个汉字对应的内码。但是,我的程序里面每次读到的都是汉字的双字节内码的单独的一个字节。
第一次读第一字节,第二次读第二字节。GUI_UC_ENCODENONE.c这个文件里面,最后的那个函数又无法实现。不能实现这个函数,就没办法一次使用这个文件里面的读2汉字的方法。

我看你的代码里面直接把他注释掉了。那你是怎么样做到可以正确识别汉字的内码的呢?

出0入0汤圆

发表于 2014-10-19 10:26:55 | 显示全部楼层
请问如果用stm32f10x的资源,能使用emwin吗?
谢谢!

出0入0汤圆

发表于 2014-10-23 16:45:02 | 显示全部楼层
准备什么时候玩下emwin,看似很炫的样子。

出0入0汤圆

发表于 2014-10-27 14:15:25 | 显示全部楼层
收藏         

出0入0汤圆

发表于 2014-11-2 00:31:11 | 显示全部楼层
emWin可以用官方配的软件把电脑系统的字库生成专用的XBF字库的,可以存在TF卡中,也可以存在SPI FLASH中,那个的显示效果灰常好,硬件资源足可以圆滑字体,但是圆滑字体我没试过。

出0入0汤圆

发表于 2014-11-2 00:42:37 | 显示全部楼层
谢谢楼主分享

出0入0汤圆

发表于 2015-1-10 21:52:42 | 显示全部楼层
好东西收藏先!!

出0入0汤圆

发表于 2015-3-9 11:07:55 | 显示全部楼层
用得到.感谢楼主.

出0入0汤圆

发表于 2015-3-9 11:50:31 | 显示全部楼层
参考下楼主的方法, 回去也试下.

出0入0汤圆

发表于 2015-7-1 11:43:20 | 显示全部楼层
用得到.感谢楼主.

出0入0汤圆

发表于 2016-6-30 11:08:23 | 显示全部楼层
楼主可以分享一下gbk的字符集么
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-27 04:11

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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