emWin任务的具体实现(在MainTask.c文件里面):
复制代码
#include "MainTask.h"
#include "includes.h"
/*
*********************************************************************************************************
* 定义矢量字体
*********************************************************************************************************
*/
GUI_TTF_CS Cs0, Cs1, Cs2, Cs3, Cs4, Cs5;
GUI_TTF_DATA Data;
GUI_FONT Font16, Font24, Font32, Font48, Font72, Font120;
/*
*********************************************************************************************************
* 对话框信息
*********************************************************************************************************
*/
static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {
{ FRAMEWIN_CreateIndirect, "安富莱电子矢量字体展示,支持抗锯齿", 0, 0, 0, 800, 480,0, 0},
{ BUTTON_CreateIndirect, "安富莱电子", GUI_ID_BUTTON0, 30, 330, 400, 70, 0, 0},
{ TEXT_CreateIndirect, "安富莱电子AaAa-16点半角全角", GUI_ID_TEXT0, 0, 0, 800, 16, 0,0},
{ TEXT_CreateIndirect, "安富莱电子AaAa-24点半角全角", GUI_ID_TEXT1, 0, 16, 800, 24, 0,0},
{ TEXT_CreateIndirect, "安富莱电子AaAa-32点半角全角", GUI_ID_TEXT2, 0, 40, 800, 32, 0,0},
{ TEXT_CreateIndirect, "安富莱电子AaAa-48点半角全角", GUI_ID_TEXT3, 0, 72, 800, 48, 0,0},
{ TEXT_CreateIndirect, "安富莱电子AaAa-72点", GUI_ID_TEXT4, 0, 120, 800, 72, 0,0},
{ TEXT_CreateIndirect, "安富莱电子120点", GUI_ID_TEXT5, 0, 192, 800, 120, 0,0},
};
/*
*********************************************************************************************************
* 函 数 名: PaintDialog
* 功能说明: 重绘
* 形 参:pMsg 消息指针
* 返 回 值: 无
*********************************************************************************************************
*/
void PaintDialog(WM_MESSAGE * pMsg)
{
}
/*
*********************************************************************************************************
* 函 数 名: InitDialog
* 功能说明: 对话框初始化
* 形 参: pMsg 消息指针
* 返 回 值: 无
*********************************************************************************************************
*/
void InitDialog(WM_MESSAGE * pMsg)
{
WM_HWIN hWin = pMsg->hWin;
//
// 框架窗口设置
//
FRAMEWIN_SetFont(hWin,&Font32);
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);
//
// 按钮控件设置
//
BUTTON_SetFont(WM_GetDialogItem(hWin,GUI_ID_BUTTON0),&Font48);
//
// 文本控件设置
//
TEXT_SetTextColor(WM_GetDialogItem(hWin,GUI_ID_TEXT0), GUI_BLACK);
TEXT_SetFont(WM_GetDialogItem(hWin,GUI_ID_TEXT0), &Font16);
TEXT_SetTextColor(WM_GetDialogItem(hWin,GUI_ID_TEXT1), GUI_BLUE);
TEXT_SetFont(WM_GetDialogItem(hWin,GUI_ID_TEXT1), &Font24);
TEXT_SetTextColor(WM_GetDialogItem(hWin,GUI_ID_TEXT2), GUI_ORANGE);
TEXT_SetFont(WM_GetDialogItem(hWin,GUI_ID_TEXT2), &Font32);
TEXT_SetTextColor(WM_GetDialogItem(hWin,GUI_ID_TEXT3), GUI_MAGENTA);
TEXT_SetFont(WM_GetDialogItem(hWin,GUI_ID_TEXT3), &Font48);
TEXT_SetTextColor(WM_GetDialogItem(hWin,GUI_ID_TEXT4), GUI_BLUE);
TEXT_SetFont(WM_GetDialogItem(hWin,GUI_ID_TEXT4), &Font72);
TEXT_SetTextColor(WM_GetDialogItem(hWin,GUI_ID_TEXT5), GUI_RED);
TEXT_SetFont(WM_GetDialogItem(hWin,GUI_ID_TEXT5), &Font120);
}
/*
*********************************************************************************************************
* 函 数 名: _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);
}
}
/*
*********************************************************************************************************
* 函 数 名: LoadFontTTF
* 功能说明: 从SD卡中读取矢量字体库到SDRAM中并创建矢量字体
* 形 参: sFilename 要读取的文件名
* 返 回 值: 无
*********************************************************************************************************
*/
void LoadFontTTF(const char *sFilename)
{
char *_acBuffer;
GUI_HMEM hMem;
/* 打开文件 */
result = f_open(&file, sFilename, FA_OPEN_EXISTING | FA_READ | FA_OPEN_ALWAYS);
if (result != FR_OK)
{
return;
}
/* 申请一块内存空间 并且将其清零 */
hMem = GUI_ALLOC_AllocZero(file.fsize);
/* 将申请到内存的句柄转换成指针类型 */
_acBuffer = GUI_ALLOC_h2p(hMem);
/* 读取文件到动态内存 */
result = f_read(&file, _acBuffer, file.fsize, &bw);
if (result != FR_OK)
{
return;
}
/* 设置参数 */
Data.pData = _acBuffer;
Data.NumBytes = file.fsize;
/* 设置第1种字体显示方式 */
Cs0.pTTF = &Data; /* 矢量字体数据地址 */
Cs0.PixelHeight = 16; /* 字体高度 */
Cs0.FaceIndex = 0;
/* 设置第2种字体显示方式 */
Cs1.pTTF = &Data; /* 矢量字体数据地址 */
Cs1.PixelHeight = 24; /* 字体高度 */
Cs1.FaceIndex = 0;
/* 设置第3种字体显示方式 */
Cs2.pTTF = &Data; /* 矢量字体数据地址 */
Cs2.PixelHeight = 32; /* 字体高度 */
Cs2.FaceIndex = 0;
/* 设置第4种字体显示方式 */
Cs3.pTTF = &Data; /* 矢量字体数据地址 */
Cs3.PixelHeight = 48; /* 字体高度 */
Cs3.FaceIndex = 0;
/* 设置第5种字体显示方式 */
Cs4.pTTF = &Data; /* 矢量字体数据地址 */
Cs4.PixelHeight = 72; /* 字体高度 */
Cs4.FaceIndex = 0;
/* 设置第6种字体显示方式 */
Cs5.pTTF = &Data; /* 矢量字体数据地址 */
Cs5.PixelHeight = 120; /* 字体高度 */
Cs5.FaceIndex = 0;
/* 创建6种字体 */
GUI_TTF_CreateFontAA(&Font16, &Cs0);
GUI_TTF_CreateFontAA(&Font24, &Cs1);
GUI_TTF_CreateFontAA(&Font32, &Cs2);
GUI_TTF_CreateFontAA(&Font48, &Cs3);
GUI_TTF_CreateFontAA(&Font72, &Cs4);
GUI_TTF_CreateFontAA(&Font120, &Cs5);
f_close(&file);
}
/*
*********************************************************************************************************
* 函 数 名: MainTask
* 功能说明: GUI主函数
* 形 参: 无
* 返 回 值: 无
*********************************************************************************************************
*/
void MainTask(void)
{
uint16_t i;
char cDispBuf[80];
/* 初始化 */
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);
/* 清屏 */
GUI_SetBkColor(GUI_BLUE);
GUI_Clear();
/* 设置字体 */
GUI_SetFont(GUI_FONT_20_1);
GUI_DispStringAt("1. Please make sure the song.ttf is saved in SD", 0, 0);
GUI_DispStringAt("2. if the song.ttf is not saved in SD, this lab will fail", 0, 24);
/* 等待10s后开始进行复制,方便客户看屏幕上的显示信息 */
for(i = 0; i < 11; i++)
{
sprintf(cDispBuf, "3. 10 seconds will start, %ds.. ", 10 - i);
GUI_DispStringAt(cDispBuf, 0, 48);
GUI_Delay(1000);
}
GUI_DispStringAt("Loading song.ttf file from sdcard, please wait....", 0, 72);
/*
触摸校准函数默认是注释掉的,电阻屏需要校准,电容屏无需校准。如果用户需要校准电阻屏的话,执行
此函数即可,会将触摸校准参数保存到EEPROM里面,以后系统上电会自动从EEPROM里面加载。
*/
//TOUCH_Calibration();
/* 使能UTF-8编码 */
GUI_UC_SetEncodeUTF8();
/* 将字库从SD卡中加载到SP FLASH里面,加载一次即可,以后使用注释掉此函数 */
LoadFontTTF("song.ttf");
/* 调用此函数会自动的刷新桌面窗口 */
WM_SetDesktopColor(GUI_BLUE);
/* 创建对话框 */
GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), &_cbCallback, 0, 0, 0);
while(1)
{
GUI_Delay(10);
}
} |