emWin功能的具体实现(在MainTask.c文件里面):
复制代码
#include "MainTask.h"
/*
*********************************************************************************************************
* 宏定义
*********************************************************************************************************
*/
/* 用于选择使用的显示方法:Method1,Method2和Method3 */
#define Method2
/*
*********************************************************************************************************
* 函 数 名: _ShowStreamBitmap
* 功能说明: 显示流位图
* 形 参: sFilename 要读取的文件名
* x 要显示的x轴坐标位置
* y 要显示的y轴坐标位置
* 返 回 值: 无
*********************************************************************************************************
*/
static void _ShowStreamBitmap(const char *sFilename, int x, int y)
{
GUI_HMEM hMem;
char *_acBuffer;
#if !defined Method1
GUI_BITMAP Bitmap;
GUI_LOGPALETTE Palette;
#endif
/* 打开文件 */
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;
}
/* 关闭文件 */
f_close(&file);
/* 显示方法一 */
#if defined Method1
GUI_DrawStreamedBitmapAuto(_acBuffer, x, y);
/* 显示方法二 */
#elif defined Method2
GUI_CreateBitmapFromStream(&Bitmap, &Palette, _acBuffer);
GUI_DrawBitmap(&Bitmap, x, y);
/* 显示方法三 仅支持RGB565格式的图片显示 */
#elif defined Method3
GUI_CreateBitmapFromStream565(&Bitmap, &Palette, _acBuffer);
GUI_DrawBitmap(&Bitmap, x, y);
#endif
/* 释放动态内存,这里有两点注意事项:
1. 如果这个流位图是一直要使用的,动态内存是不可以释放的。
2. 如果使用的是方法2或者方法3进行显示,且此流位图是要一直使用,变量
GUI_BITMAP Bitmap和GUI_LOGPALETTE Palette不可以定义成局部变量,因为
退出函数后,局部变量就被释放给栈空间了。
*/
GUI_ALLOC_Free(hMem);
}
/*
*********************************************************************************************************
* 函 数 名: 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_SetFont(&GUI_Font16B_ASCII);
/* 显示RGB565格式的流位图 */
GUI_DispStringAt("This is RGB565 Stream bitmap", 100, 50);
_ShowStreamBitmap("pic.dta", 20, 20);
/* 显示ARGB8888格式的流位图 */
GUI_DispStringAt("This is ARGB8888 Stream bitmap", 100, 150);
_ShowStreamBitmap("pic1.dta", 20, 120);
while(1)
{
GUI_Delay(10);
}
} |