新手上路
- 积分
- 41
- 金钱
- 41
- 注册时间
- 2015-12-16
- 在线时间
- 9 小时
|
30金钱
我写了一个简单的界面,由3个页面组成,第一个页面点按钮进入第二个页面,第二个页面点最后一个按钮进入第三个页面。这个功能可以实现了,问题是,第二个页面还有其他按钮,我想实现的功能是按了按钮之后,在指定位置显示BMP图片。所以调用了dispbmpex函数,发现没效果,但是如果单独运行显示BMP图片的例程又没问题。
我想问的就是如何实现,按了按钮之后,在指定位置显示存储在SD卡中的BMP图片。
附上一些代码,麻烦大神指点
static int BmpGetData(void * p, const U8 ** ppData, unsigned NumBytesReq, U32 Off)
{
static int readaddress=0;
FIL * phFile;
UINT NumBytesRead;
#if SYSTEM_SUPPORT_OS
CPU_SR_ALLOC();
#endif
phFile = (FIL *)p;
if (NumBytesReq > sizeof(bmpBuffer))
{
NumBytesReq = sizeof(bmpBuffer);
}
//移动指针到应该读取的位置
if(Off == 1) readaddress = 0;
else readaddress=Off;
#if SYSTEM_SUPPORT_OS
OS_CRITICAL_ENTER(); //临界区
#endif
f_lseek(phFile,readaddress);
//读取数据到缓冲区中
f_read(phFile,bmpBuffer,NumBytesReq,&NumBytesRead);
#if SYSTEM_SUPPORT_OS
OS_CRITICAL_EXIT(); //退出临界区
#endif
*ppData = (U8 *)bmpBuffer;
return NumBytesRead;//返回读取到的字节数
}
int dispbmpex(u8 *BMPFileName,u8 mode,u32 x,u32 y,int member,int denom)
{
char result;
int XSize,YSize;
float Xflag,Yflag;
GUI_COLOR forecolor,bkcolor;
forecolor=GUI_GetColor(); //获取当前前景色
bkcolor=GUI_GetBkColor(); //获取当前背景色
result = f_open(&BMPFile,(const TCHAR*)BMPFileName,FA_READ); //打开文件
//文件打开错误
if(result != FR_OK) return 1;
switch(mode)
{
case 0: //在指定位置显示图片
if((member == 1) && (denom == 1)) //无需缩放,直接绘制
{
GUI_BMP_DrawEx(BmpGetData,&BMPFile,x,y);//在指定位置显示BMP图片
}else //否则图片需要缩放
{
GUI_BMP_DrawScaledEx(BmpGetData,&BMPFile,x,y,member,denom);
}
break;
case 1: //在LCD中间显示图片
XSize = GUI_BMP_GetXSizeEx(BmpGetData,&BMPFile); //获取图片的X轴大小
YSize = GUI_BMP_GetYSizeEx(BmpGetData,&BMPFile); //获取图片的Y轴大小
if((member == 1) && (denom == 1)) //无需缩放,直接绘制
{
//在LCD中间显示图片
GUI_BMP_DrawEx(BmpGetData,&BMPFile,(lcddev.width-XSize)/2-1,(lcddev.height-YSize)/2-1);
}else //否则图片需要缩放
{
Xflag = (float)XSize*((float)member/(float)denom);
Yflag = (float)YSize*((float)member/(float)denom);
XSize = (lcddev.width-(int)Xflag)/2-1;
YSize = (lcddev.height-(int)Yflag)/2-1;
GUI_BMP_DrawScaledEx(BmpGetData,&BMPFile,XSize,YSize,member,denom);
}
break;
}
f_close(&BMPFile); //关闭BMPFile文件
GUI_SetColor(forecolor); //恢复前景色
GUI_SetBkColor(bkcolor); //恢复背景色
return 0;
}
case WM_NOTIFY_PARENT:
Id = WM_GetId(pMsg->hWinSrc);
NCode = pMsg->Data.v;
switch(Id) {
case ID_BUTTON_0: // Notifications sent by 'Button'
switch(NCode) {
case WM_NOTIFICATION_CLICKED:
// USER START (Optionally insert code for reacting on notification message)
// USER END
break;
case WM_NOTIFICATION_RELEASED:
// USER START (Optionally insert code for reacting on notification message)
// USER END
break;
// USER START (Optionally insert additional code for further notification handling)
// USER END
}
break;
case ID_BUTTON_1: // Notifications sent by 'Button'
switch(NCode) {
case WM_NOTIFICATION_CLICKED:
// USER START (Optionally insert code for reacting on notification message)
// USER END
break;
case WM_NOTIFICATION_RELEASED:
// USER START (Optionally insert code for reacting on notification message)
{
dispbmpex("0:/PHOTO/VC_300m1.bmp",0,160,0,1,1);
}
// USER END
break;
|
|