金牌会员
 
- 积分
- 1073
- 金钱
- 1073
- 注册时间
- 2012-1-10
- 在线时间
- 237 小时
|

楼主 |
发表于 2016-11-28 13:45:46
|
显示全部楼层
本帖最后由 magicoctoy 于 2016-11-28 13:48 编辑
解决图片显示“拉窗帘”,立即刷新图片。参考了安富莱的开发板的STemWin显示BMP例子。
移植原子的STemWin显示BMP图片的例子程序。将LCDConf_FlexColor_Template.c注释掉,使用LCDConf_Lin_Template.c文件。
增加程序:
GUI_HMEM _ShowBMP2(u8 *BMPFileName,u32 x,u32 y)
{
u16 bread;
char *_acBuffer;
char result;
int XSize,YSize;
GUI_HMEM hMem;
GUI_MEMDEV_Handle hMemBMP;
result = f_open(&BMPFile,(const TCHAR*)BMPFileName,FA_READ); //打开文件
//文件打开错误或者文件大于BMPMEMORYSIZE
if((result != FR_OK) || (BMPFile.obj.objsize>BMPMEMORYSIZE)){
return 1;
}
/* 申请一块内存空间 并且将其清零 */
hMem = GUI_ALLOC_AllocZero(BMPFile.obj.objsize);
/* 将申请到内存的句柄转换成指针类型 */
_acBuffer = GUI_ALLOC_h2p(hMem);
/* 读取文件到动态内存 */
result = f_read(&BMPFile,_acBuffer,BMPFile.obj.objsize,(UINT *)&bread); //读取数据
if (result != FR_OK){
return 3;
}
XSize = GUI_BMP_GetXSize(_acBuffer);//返回存储设备的X尺寸(宽度)
YSize = GUI_BMP_GetYSize(_acBuffer);//返回存储设备的X尺寸(高度)
/* 创建内存设备,并将BMP图片绘制到此内存设备里面,此内存设备要在主程序中用到
所以退出此函数前,不要释放。
*/
hMemBMP = GUI_MEMDEV_CreateEx(0, 0, XSize, YSize, GUI_MEMDEV_HASTRANS);//创建具有额外创建标志的存储设备
GUI_MEMDEV_Select(hMemBMP); //选择作为绘制操作目标的储存设备
GUI_BMP_Draw(_acBuffer, 0, 0); //绘制已加载到存储器的BMP文件
GUI_MEMDEV_Select(0); //选择作为绘制操作目标的储存设备
/* 释放动态内存hMem */
GUI_ALLOC_Free(hMem);
f_close(&BMPFile); //关闭BMPFile文件
return hMemBMP;;
}
在主程序中调用:
hMemBMP = _ShowBMP2("0:/PICTURE/0.bmp", 0, 0);
/* 用到BMP图片的时候,调用此函数即可 */
GUI_MEMDEV_WriteAt(hMemBMP, 0, 0); //将存储设备的内容写入存储设备的给定位置
GUI_MEMDEV_Delete(hMemBMP); //释放存储设备使用的内存
GUI_Delay(3000);
|
|