20.2 移植到开发板上显示 移植到开发上的程序主要分为两部分,一个是从SD卡中读取字体的驱动,另一个建立一个对话框显示字体。 20.2.1 创建XBF字体
- GUI_XBF_DATA XBF_Data;
- GUI_FONT XBF_Font;
- FIL Fontfile;
-
- /*
- *********************************************************************************************************
- *
- * _cbGetData
- *
- * Function description
- * Callback function for getting font data
- *
- * Parameters:
- * Off - Position of XBF file to be read
- * NumBytes - Number of requested bytes
- * pVoid - Application defined pointer
- * pBuffer - Pointer to buffer to be filled by the function
- *
- * Return value:
- * 0 on success, 1 on error
- *********************************************************************************************************
- */
- static int _cbGetData(U32 Off, U16 NumBytes, void * pVoid, void * pBuffer) (1)
- {
- FIL *FontFile;
-
- /* The pVoid pointer may be used to get a file handle */
- FontFile = (FIL *)pVoid;
-
- /*
- * Set file pointer to the required position
- */
- result =f_lseek(FontFile, Off);
- if (result != FR_OK)
- {
- return 1; /* Error */
- }
-
- /*
- * Read data into buffer
- */
- result = f_read(FontFile, pBuffer, NumBytes, &bw);
- if (result != FR_OK)
- {
- return 1; /* Error */
- }
- return 0;
-
- }
-
- /*
- *********************************************************************************************************
- * 函 数 名: _ShowXBF
- * 功能说明: 使用XBF字体
- * 形 参:无
- * 返 回 值: 无
- *********************************************************************************************************
- */
- static void _ShowXBF(void)
- {
- result = f_open(&Fontfile, "YaHe.xbf", FA_OPEN_EXISTING | FA_READ | FA_OPEN_ALWAYS);(2)
- if (result != FR_OK)
- {
- return;
-
- }
-
- //
- // Create XBF font
- //
- GUI_XBF_CreateFont(&XBF_Font, // Pointer to GUI_FONT structure in RAM(3)
- &XBF_Data, // Pointer to GUI_XBF_DATA structure in RAM
- GUI_XBF_TYPE_PROP_AA4_EXT, // Font type to be created
- _cbGetData, // Pointer to callback function
- &Fontfile); // Pointer to be passed to GetData function
- }
复制代码
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 主函数
- /*
- *********************************************************************************************************
- * 对话框信息
- *********************************************************************************************************
- */
- static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {
- { FRAMEWIN_CreateIndirect, "armfly", 0, 0, 0, 800,480,FRAMEWIN_CF_MOVEABLE,0},
- { BUTTON_CreateIndirect, "安富莱电子", GUI_ID_BUTTON0, 390,40,360,100,0,0},
- { TEXT_CreateIndirect, "安富莱电子", GUI_ID_TEXT0, 5, 10, 300, 70, 0,0},
- { TEXT_CreateIndirect, "安富莱电子", GUI_ID_TEXT1, 5, 80,300, 70, 0,0},
- { TEXT_CreateIndirect, "安富莱电子", GUI_ID_TEXT2, 5, 160,300, 70, 0,0}
- };
-
- /*
- *********************************************************************************************************
- * 函 数 名: PaintDialog
- * 功能说明: 重绘函数
- * 形 参:pMsg 消息指针
- * 返 回 值: 无
- *********************************************************************************************************
- */
- void PaintDialog(WM_MESSAGE * pMsg)
- {
- WM_HWIN hWin = pMsg->hWin;
- }
-
- /*
- *********************************************************************************************************
- * 函 数 名: InitDialog
- * 功能说明: 对话框初始化
- * 形 参: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);
- //
- //GUI_ID_BUTTON0
- //
- _ShowXBF();(1)
- GUI_UC_SetEncodeUTF8();(2)
- BUTTON_SetFont(WM_GetDialogItem(hWin,GUI_ID_BUTTON0),&XBF_Font);(3)
- //
- //GUI_ID_TEXT0
- //
- TEXT_SetTextColor(WM_GetDialogItem(hWin,GUI_ID_TEXT0), GUI_RED);
- TEXT_SetFont(WM_GetDialogItem(hWin,GUI_ID_TEXT0),&XBF_Font);
- TEXT_SetTextColor(WM_GetDialogItem(hWin,GUI_ID_TEXT1), GUI_GREEN);
- TEXT_SetFont(WM_GetDialogItem(hWin,GUI_ID_TEXT1),&XBF_Font);
- TEXT_SetTextColor(WM_GetDialogItem(hWin,GUI_ID_TEXT2), GUI_BLUE);
- TEXT_SetFont(WM_GetDialogItem(hWin,GUI_ID_TEXT2),&XBF_Font);
- // GUI_UC_SetEncodeNone();
- }
-
- /*
- *********************************************************************************************************
- * 函 数 名: _cbCallback
- * 功能说明: 对话框回调函数
- * 形 参:无
- * 返 回 值: 无
- *********************************************************************************************************
- */
- 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_SetDesktopColor(GUI_WHITE); /* Automacally update desktop window */
- WM_SetCreateFlags(WM_CF_MEMDEV); /* Use memory devices on all windows to avoid flicker */
- PROGBAR_SetDefaultSkin(PROGBAR_SKIN_FLEX);
- FRAMEWIN_SetDefaultSkin(FRAMEWIN_SKIN_FLEX);
- PROGBAR_SetDefaultSkin(PROGBAR_SKIN_FLEX);
- BUTTON_SetDefaultSkin(BUTTON_SKIN_FLEX);
- CHECKBOX_SetDefaultSkin(CHECKBOX_SKIN_FLEX);
- DROPDOWN_SetDefaultSkin(DROPDOWN_SKIN_FLEX);
- SCROLLBAR_SetDefaultSkin(SCROLLBAR_SKIN_FLEX);
- SLIDER_SetDefaultSkin(SLIDER_SKIN_FLEX);
- HEADER_SetDefaultSkin(HEADER_SKIN_FLEX);
- RADIO_SetDefaultSkin(RADIO_SKIN_FLEX);
- GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), &_cbCallback, 0, 0, 0);
- while(1)
- {
- GUI_Delay(10);
- }
- }
复制代码
1. 创建XBF字体。 2. 使能UTF-8解码 3. 在按钮中显示的字体使用XBF字体。 4. 还有最重要的一条,上面的这些函数都是在MainTask.c文件里面的,这个文件的编码格式必须得是UTF-8,设置方法在前面18.1.6小节有说明。 实际显示效果如下:
特别注意,如果使用的是800*480分辨率的屏可以完成显示出来,如果是小于这个分辨率的屏只能显示出一部分,大家可以按照上面的设计方法做一个适合自己屏大小的显示或者直接拖动这个对话框即可。
|