OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3880|回复: 4

关于EMWIN按钮显示图片的问题

[复制链接]

5

主题

15

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2015-12-16
在线时间
9 小时
发表于 2017-2-24 15:38:26 | 显示全部楼层 |阅读模式
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;

最佳答案

查看完整内容[请看2#楼]

在显示图片之前选定窗口就可以了 添加WM_SelectWindow(pMsg->hWin);
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

5

主题

15

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2015-12-16
在线时间
9 小时
 楼主| 发表于 2017-2-24 15:38:27 | 显示全部楼层
在显示图片之前选定窗口就可以了
添加WM_SelectWindow(pMsg->hWin);
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2017-2-24 18:47:22 | 显示全部楼层
帮顶
回复

使用道具 举报

5

主题

15

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2015-12-16
在线时间
9 小时
 楼主| 发表于 2017-2-26 16:05:38 | 显示全部楼层
有没有大神来帮忙看看。。。。
回复

使用道具 举报

5

主题

15

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2015-12-16
在线时间
9 小时
 楼主| 发表于 2017-2-26 17:30:31 | 显示全部楼层
解决了。。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 03:05

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表