emWin功能的具体实现(在MainTask.c文件里面):
复制代码
#include "MainTask.h"
#include "bsp.h"
/*
*********************************************************************************************************
* 变量
*********************************************************************************************************
*/
uint8_t tempbuf[4096]; /* 从SD卡读取数据的缓冲 */
/*
*********************************************************************************************************
* 对话框信息
*********************************************************************************************************
*/
static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {
{ FRAMEWIN_CreateIndirect, "安富莱电子", 0, 0, 0, 480, 272,FRAMEWIN_CF_MOVEABLE, 0},
{ BUTTON_CreateIndirect, "安富莱电子", GUI_ID_BUTTON0, 10, 150, 400, 50, 0, 0},
{ TEXT_CreateIndirect, "安富莱电子AaAa-12点阵半角全角", GUI_ID_TEXT0, 0, 10, 480, 33, 0,0},
{ TEXT_CreateIndirect, "安富莱电子AaAa-16点阵半角全角", GUI_ID_TEXT1, 0, 40, 480, 33, 0,0},
{ TEXT_CreateIndirect, "安富莱电子AaAa-24点阵半角全角", GUI_ID_TEXT2, 0, 70, 480, 72, 0,0},
{ TEXT_CreateIndirect, "安富莱电子AaAa-32点阵半全角", GUI_ID_TEXT3, 0, 100, 480, 72, 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_FontHZ24);
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
//
BUTTON_SetFont(WM_GetDialogItem(hWin,GUI_ID_BUTTON0),&GUI_FontHZ32);
//
//GUI_ID_TEXT0
//
TEXT_SetTextColor(WM_GetDialogItem(hWin,GUI_ID_TEXT0), GUI_RED);
TEXT_SetFont(WM_GetDialogItem(hWin,GUI_ID_TEXT0),&GUI_FontHZ12);
TEXT_SetTextColor(WM_GetDialogItem(hWin,GUI_ID_TEXT1), GUI_YELLOW);
TEXT_SetFont(WM_GetDialogItem(hWin,GUI_ID_TEXT1),&GUI_FontHZ16);
TEXT_SetTextColor(WM_GetDialogItem(hWin,GUI_ID_TEXT2), GUI_BLUE);
TEXT_SetFont(WM_GetDialogItem(hWin,GUI_ID_TEXT2),&GUI_FontHZ24);
TEXT_SetTextColor(WM_GetDialogItem(hWin,GUI_ID_TEXT3), GUI_ORANGE);
TEXT_SetFont(WM_GetDialogItem(hWin,GUI_ID_TEXT3),&GUI_FontHZ32);
}
/*
*********************************************************************************************************
* 函 数 名: _cbCallback
* 功能说明: 对话框回调函数
* 形 参: pMsg 消息指针
* 返 回 值: 无
*********************************************************************************************************
*/
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);
}
}
/*
*********************************************************************************************************
* 函 数 名: LoadFontLib()
* 功能说明: 从SD卡中加载字库文件到SPI FLASH
* 形 参: 无
* 返 回 值: 无
*********************************************************************************************************
*/
void LoadFontLib(void)
{
float FinishPecent;
uint32_t Count = 0;
uint16_t y, i;
uint8_t ucState;
char cDispBuf[80];
/* 清屏 */
GUI_SetBkColor(GUI_BLUE);
GUI_Clear();
/* 设置字体 */
GUI_SetFont(GUI_FONT_20_1);
y = 0;
/* 第1步:显示操作说明 ***************************************************************/
GUI_DispStringAt("SPI Flash Chinese character Lab", 0, y);
y += 20;
GUI_DispStringAt("1. Please make sure the font.bin is saved in SD", 0, y);
y += 20;
GUI_DispStringAt("2. if the font.bin is not saved in SD, this lab will fail", 0, y);
y += 20;
/* 等待10s后开始进行复制,方便客户看屏幕上的显示信息 */
for(i = 0; i < 11; i++)
{
sprintf(cDispBuf, "3. 10 seconds will start, %ds.. ", 10 - i);
GUI_DispStringAt(cDispBuf, 0, y);
GUI_Delay(1000);
}
y += 20;
/* 第2步:打开文件 ***************************************************************/
result = f_open(&file, "font.bin", FA_OPEN_EXISTING | FA_READ);
if (result != FR_OK)
{
GUI_DispStringAt("font.bin open failed", 0, y);
y += 20;
}
/* 第3步:复制SD卡中字库文件font.bin到SPI FLASH **********************************/
for(;;)
{
/* 读取一个扇区的数据到buf */
result = f_read(&file, &tempbuf, g_tSF.PageSize, &bw);
/* 读取出错或者读取完毕,退出 */
if ((result != FR_OK)||bw == 0)
{
break;
}
/* 写数据到SPI FLASH */
ucState = sf_WriteBuffer(tempbuf, Count*g_tSF.PageSize, g_tSF.PageSize);
/* 如果返回0,表示复制失败 */
if(ucState == 0)
{
GUI_DispStringAt("copy failed ", 0, y);
break;
}
/* 显示复制进度 */
Count = Count + 1;
FinishPecent = (float)(Count* g_tSF.PageSize) / file.fsize;
sprintf(cDispBuf, "copying:%02d%%", (uint8_t)(FinishPecent*100));
GUI_DispStringAt(cDispBuf, 0, y);
}
/* 等待1秒后开始进去emWin主界面 */
GUI_Delay(1000);
}
/*
*********************************************************************************************************
* 函 数 名: MainTask
* 功能说明: GUI主函数
* 形 参: 无
* 返 回 值: 无
*********************************************************************************************************
*/
void MainTask(void)
{
/* 初始化 */
GUI_Init();
/*
关于多缓冲和窗口内存设备的设置说明
1. 使能多缓冲是调用的如下函数,用户要在LCDConf_Lin_Template.c文件中配置了多缓冲,调用此函数才有效:
WM_MULTIBUF_Enable(1);
2. 窗口使能使用内存设备是调用函数:WM_SetCreateFlags(WM_CF_MEMDEV);
3. 如果emWin的配置多缓冲和窗口内存设备都支持,二选一即可,且务必优先选择使用多缓冲,实际使用
STM32F429BIT6 + 32位SDRAM + RGB565/RGB888平台测试,多缓冲可以有效的降低窗口移动或者滑动时的撕裂
感,并有效的提高流畅性,通过使能窗口使用内存设备是做不到的。
4. 所有emWin例子默认是开启三缓冲。
*/
WM_MULTIBUF_Enable(1);
/*
触摸校准函数默认是注释掉的,电阻屏需要校准,电容屏无需校准。如果用户需要校准电阻屏的话,执行
此函数即可,会将触摸校准参数保存到EEPROM里面,以后系统上电会自动从EEPROM里面加载。
*/
//TOUCH_Calibration();
/* 初始化使用GUI以前,先将字库从SD卡中加载到SP FLASH里面 */
LoadFontLib();
/* 调用此函数会自动的刷新桌面窗口 */
WM_SetDesktopColor(GUI_BLUE);
/* 创建对话框 */
GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), &_cbCallback, 0, 0, 0);
while(1)
{
GUI_Delay(10);
}
} |