微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 第20章 XBF外置字体方法(官方推荐)

第20章 XBF外置字体方法(官方推荐)

时间:10-02 整理:3721RD 点击:
第20章 XBF外置字体方法(官方推荐)

    官方给的这种外置字体方法非常好,而且还可以支持抗锯齿,显示效果非常好,本期教程就是教会大家这种方式。用FontCvt生成的XBF格式字体文件可以在外部存储器,本期教程就以SD卡为例跟大家讲解。

    20. 1  XBF格式字体生成方法

    20. 2 移植到开发板上显示

    20. 3 总结

20.1 XBF格式字体生成方法

    这里我们使用FontCvt生成一种微软雅黑字体,字体选择36号并选带扩展的4位抗锯齿效果。

20.1.1 第一步:选择带扩展的4位抗锯齿



20.1.2 第二步:选择字体类型和大小



20.1.3 第三步:另存为XBF格式文件





    此过程字体生成的时间有点长,大家要耐心等待,生成后文件大小:




20.2 移植到开发板上显示

    移植到开发上的程序主要分为两部分,一个是从SD卡中读取字体的驱动,另一个建立一个对话框显示字体。

20.2.1 创建XBF字体

  1. GUI_XBF_DATA XBF_Data;
  2. GUI_FONT     XBF_Font;
  3. FIL          Fontfile;

  4. /*
  5. *********************************************************************************************************
  6. *
  7. *       _cbGetData
  8. *
  9. * Function description
  10. *   Callback function for getting font data
  11. *
  12. * Parameters:
  13. *   Off      - Position of XBF file to be read
  14. *   NumBytes - Number of requested bytes
  15. *   pVoid    - Application defined pointer
  16. *   pBuffer  - Pointer to buffer to be filled by the function
  17. *
  18. * Return value:
  19. *   0 on success, 1 on error
  20. *********************************************************************************************************
  21. */
  22. static int _cbGetData(U32 Off, U16 NumBytes, void * pVoid, void * pBuffer) (1)
  23. {
  24. FIL *FontFile;

  25. /* The pVoid pointer may be used to get a file handle */
  26. FontFile = (FIL *)pVoid;

  27. /*
  28. * Set file pointer to the required position
  29. */
  30. result =f_lseek(FontFile, Off);
  31. if (result != FR_OK)
  32. {
  33. return 1; /* Error */
  34. }

  35. /*
  36. * Read data into buffer
  37. */
  38. result = f_read(FontFile, pBuffer, NumBytes, &bw);
  39. if (result != FR_OK)
  40. {
  41. return 1; /* Error */
  42. }
  43. return 0;

  44. }

  45. /*
  46. *********************************************************************************************************
  47. *        函 数 名: _ShowXBF
  48. *        功能说明: 使用XBF字体
  49. *        形    参:无
  50. *        返 回 值: 无
  51. *********************************************************************************************************
  52. */
  53. static void _ShowXBF(void)
  54. {
  55. result = f_open(&Fontfile, "YaHe.xbf", FA_OPEN_EXISTING | FA_READ | FA_OPEN_ALWAYS);(2)
  56. if (result != FR_OK)
  57. {
  58. return;

  59. }

  60. //
  61. // Create XBF font
  62. //
  63. GUI_XBF_CreateFont(&XBF_Font,       // Pointer to GUI_FONT structure in RAM(3)
  64. &XBF_Data,         // Pointer to GUI_XBF_DATA structure in RAM
  65. GUI_XBF_TYPE_PROP_AA4_EXT, // Font type to be created
  66. _cbGetData,        // Pointer to callback function
  67. &Fontfile);        // Pointer to be passed to GetData function
  68. }

复制代码

1. 从SD卡中读取字体文件的方法。

2. 由于没有开启FatFS的长文件名,文件的名字要符合8.3格式。

3. 创建XBF_Font字体。默认情况下,每个字符的数据字节最大值限制为200。这应该满足大部分要求。如果加载使用更多字节的字符,在调试版本中将生成警告。通过向文件GUIConf.h添加以下定义可增加默认值:

      #define GUI_MAX_XBF_BYTES 500 // Sets the maximum number of bytes/chars to 500

    默认的定义在文件GUI_ConfDefaults.h文件里面:

      #ifndef   GUI_MAX_XBF_BYTES

       #define GUI_MAX_XBF_BYTES 200

      #endif

20.2.2 主函数

  1. /*
  2. *********************************************************************************************************
  3. *        对话框信息
  4. *********************************************************************************************************
  5. */
  6. static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {
  7.     { FRAMEWIN_CreateIndirect,  "armfly",            0,                       0,  0,  800,480,FRAMEWIN_CF_MOVEABLE,0},
  8.     { BUTTON_CreateIndirect,    "安富莱电子",        GUI_ID_BUTTON0,          390,40,360,100,0,0},
  9.     { TEXT_CreateIndirect,      "安富莱电子",        GUI_ID_TEXT0,            5, 10, 300, 70, 0,0},
  10.     { TEXT_CreateIndirect,      "安富莱电子",        GUI_ID_TEXT1,            5, 80,300, 70, 0,0},
  11.     { TEXT_CreateIndirect,      "安富莱电子",        GUI_ID_TEXT2,            5, 160,300, 70, 0,0}
  12. };

  13. /*
  14. *********************************************************************************************************
  15. *        函 数 名: PaintDialog
  16. *        功能说明: 重绘函数
  17. *        形    参:pMsg 消息指针
  18. *        返 回 值: 无
  19. *********************************************************************************************************
  20. */
  21. void PaintDialog(WM_MESSAGE * pMsg)
  22. {
  23.     WM_HWIN hWin = pMsg->hWin;
  24. }

  25. /*
  26. *********************************************************************************************************
  27. *        函 数 名: InitDialog
  28. *        功能说明: 对话框初始化
  29. *        形    参:pMsg 消息指针
  30. *        返 回 值: 无
  31. *********************************************************************************************************
  32. */
  33. void InitDialog(WM_MESSAGE * pMsg)
  34. {
  35.     WM_HWIN hWin = pMsg->hWin;
  36.     //
  37.     //FRAMEWIN
  38.     //
  39.     FRAMEWIN_SetFont(hWin,&GUI_Font32B_ASCII);
  40.     FRAMEWIN_SetTextAlign(hWin,GUI_TA_VCENTER|GUI_TA_CENTER);
  41.     FRAMEWIN_AddCloseButton(hWin, FRAMEWIN_BUTTON_RIGHT, 0);
  42.     FRAMEWIN_AddMaxButton(hWin, FRAMEWIN_BUTTON_RIGHT, 1);
  43.     FRAMEWIN_AddMinButton(hWin, FRAMEWIN_BUTTON_RIGHT, 2);
  44.     FRAMEWIN_SetTitleHeight(hWin,35);
  45.     //
  46.     //GUI_ID_BUTTON0
  47.     //
  48. _ShowXBF();(1)
  49. GUI_UC_SetEncodeUTF8();(2)
  50.     BUTTON_SetFont(WM_GetDialogItem(hWin,GUI_ID_BUTTON0),&XBF_Font);(3)
  51.     //
  52.     //GUI_ID_TEXT0
  53.     //
  54. TEXT_SetTextColor(WM_GetDialogItem(hWin,GUI_ID_TEXT0), GUI_RED);
  55.     TEXT_SetFont(WM_GetDialogItem(hWin,GUI_ID_TEXT0),&XBF_Font);
  56. TEXT_SetTextColor(WM_GetDialogItem(hWin,GUI_ID_TEXT1), GUI_GREEN);
  57. TEXT_SetFont(WM_GetDialogItem(hWin,GUI_ID_TEXT1),&XBF_Font);
  58. TEXT_SetTextColor(WM_GetDialogItem(hWin,GUI_ID_TEXT2), GUI_BLUE);
  59. TEXT_SetFont(WM_GetDialogItem(hWin,GUI_ID_TEXT2),&XBF_Font);
  60. //         GUI_UC_SetEncodeNone();
  61. }

  62. /*
  63. *********************************************************************************************************
  64. *        函 数 名: _cbCallback
  65. *        功能说明: 对话框回调函数
  66. *        形    参:无
  67. *        返 回 值: 无
  68. *********************************************************************************************************
  69. */
  70. static void _cbCallback(WM_MESSAGE * pMsg)
  71. {
  72.     int NCode, Id;
  73.     WM_HWIN hWin = pMsg->hWin;
  74.     switch (pMsg->MsgId)
  75.     {
  76.         case WM_PAINT:
  77.             PaintDialog(pMsg);
  78.             break;
  79.         case WM_INIT_DIALOG:
  80.             InitDialog(pMsg);
  81.             break;
  82.         case WM_KEY:
  83.             switch (((WM_KEY_INFO*)(pMsg->Data.p))->Key)
  84.             {
  85.                 case GUI_KEY_ESCAPE:
  86.                     GUI_EndDialog(hWin, 1);
  87.                     break;
  88.                 case GUI_KEY_ENTER:
  89.                     GUI_EndDialog(hWin, 0);
  90.                     break;
  91.             }
  92.             break;
  93.         case WM_NOTIFY_PARENT:
  94.             Id = WM_GetId(pMsg->hWinSrc);
  95.             NCode = pMsg->Data.v;        
  96.             switch (Id)
  97.             {
  98.                 case GUI_ID_OK:
  99.                     if(NCode==WM_NOTIFICATION_RELEASED)
  100.                         GUI_EndDialog(hWin, 0);
  101.                     break;
  102.                 case GUI_ID_CANCEL:
  103.                     if(NCode==WM_NOTIFICATION_RELEASED)
  104.                         GUI_EndDialog(hWin, 0);
  105.                     break;

  106.             }
  107.             break;
  108.         default:
  109.             WM_DefaultProc(pMsg);
  110.     }
  111. }


  112. /*
  113. *********************************************************************************************************
  114. *        函 数 名: MainTask
  115. *        功能说明: GUI主函数
  116. *        形    参:无
  117. *        返 回 值: 无
  118. *********************************************************************************************************
  119. */
  120. void MainTask(void)
  121. {
  122.     GUI_Init();
  123.     WM_SetDesktopColor(GUI_WHITE);       /* Automacally update desktop window */
  124.     WM_SetCreateFlags(WM_CF_MEMDEV);     /* Use memory devices on all windows to avoid flicker */
  125. PROGBAR_SetDefaultSkin(PROGBAR_SKIN_FLEX);
  126. FRAMEWIN_SetDefaultSkin(FRAMEWIN_SKIN_FLEX);
  127. PROGBAR_SetDefaultSkin(PROGBAR_SKIN_FLEX);
  128. BUTTON_SetDefaultSkin(BUTTON_SKIN_FLEX);
  129. CHECKBOX_SetDefaultSkin(CHECKBOX_SKIN_FLEX);
  130. DROPDOWN_SetDefaultSkin(DROPDOWN_SKIN_FLEX);
  131. SCROLLBAR_SetDefaultSkin(SCROLLBAR_SKIN_FLEX);
  132. SLIDER_SetDefaultSkin(SLIDER_SKIN_FLEX);
  133. HEADER_SetDefaultSkin(HEADER_SKIN_FLEX);
  134. RADIO_SetDefaultSkin(RADIO_SKIN_FLEX);
  135.     GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), &_cbCallback, 0, 0, 0);
  136. while(1)
  137. {
  138. GUI_Delay(10);
  139. }
  140. }

复制代码

1. 创建XBF字体。

2. 使能UTF-8解码

3. 在按钮中显示的字体使用XBF字体。

4. 还有最重要的一条,上面的这些函数都是在MainTask.c文件里面的,这个文件的编码格式必须得是UTF-8,设置方法在前面18.1.6小节有说明。

实际显示效果如下:



    特别注意,如果使用的是800*480分辨率的屏可以完成显示出来,如果是小于这个分辨率的屏只能显示出一部分,大家可以按照上面的设计方法做一个适合自己屏大小的显示或者直接拖动这个对话框即可。


20.3 总结

    推荐大家在以后的工程中采用这种方式,这种显示方式有个问题就是显示速度有点慢。比如本期教程显示微软雅黑36号字体,4位抗锯齿。显示就有缓慢,显示小字体不带抗锯齿还是没问题的。


Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top