硬汉嵌入式论坛

 找回密码
 立即注册
查看: 3188|回复: 11
收起左侧

[emWin] IMAGE控件不能正常显示BMP图片

[复制链接]

34

主题

83

回帖

185

积分

初级会员

积分
185
发表于 2016-9-2 09:07:05 | 显示全部楼层 |阅读模式
    大家好,我用IMAGE控件做按钮利用IMAGE触摸事件处理任务目前遇到困难,

#include "home.h"
#define ID_SET_TOUCH     (ID_SET_BASE + 1)
#define ID_SET_TIME      (ID_SET_BASE + 2)
#define ID_SET_BKIMAGE  (ID_SET_BASE + 3)
#define ID_SET_HELP      (ID_SET_BASE + 4)
#define ID_SET_EXIT      (ID_SET_BASE + 5)

IMAGE_Handle SET_hImage[5];
static void _cbDialog(WM_MESSAGE * pMsg)
{
    static bool app=false;
  int i; FIL bmp;
  switch(pMsg ->MsgId)
    {
        case WM_PAINT: //重绘                  
             if(app==false)
                 {
                   f_open(&bmp,"picture/home/1.bmp",FA_READ);
             GUI_BMP_DrawEx(_Get_BackImage,(void *)&bmp,0,20);   //这里重绘的是背景图片,可以正常显示背景
             f_close(&bmp);

             f_open(&bmp,"picture/set/touch/touch.bmp",FA_READ);
                     IMAGE_SetBMPEx(SET_hImage[0],_Get_BackImage,(void *)&bmp); //这里重绘第一个IMAGE图标,不能显示
             f_close(&bmp);

           f_open(&bmp,"picture/set/time/time.bmp",FA_READ);
           IMAGE_SetBMPEx(SET_hImage[1],_Get_BackImage,(void *)&bmp); //第二个图标也不能显示
           f_close(&bmp);

           f_open(&bmp,"picture/set/bkimage/bkimage.bmp",FA_READ);
           IMAGE_SetBMPEx(SET_hImage[2],_Get_BackImage,(void *)&bmp); //以下都不能显示
           f_close(&bmp);

           f_open(&bmp,"picture/set/help/help.bmp",FA_READ);
           IMAGE_SetBMPEx(SET_hImage[3],_Get_BackImage,(void *)&bmp);
           f_close(&bmp);

           f_open(&bmp,"picture/set/exit/exit.bmp",FA_READ);
           IMAGE_SetBMPEx(SET_hImage[4],_Get_BackImage,(void *)&bmp);
           f_close(&bmp);
                 }
        break;


        case WM_NOTIFY_PARENT:
             switch(WM_GetId(pMsg ->hWinSrc))
                 {
                   case ID_SET_TOUCH:                  //触摸校准
                            switch(pMsg ->Data.v)
                                {
                                  case WM_NOTIFICATION_CLICKED:
                                           f_open(&bmp,"picture/set/touch/_touch.bmp",FA_READ);
                           IMAGE_SetBMPEx(SET_hImage[0],_Get_BackImage,(void *)&bmp);
                           f_close(&bmp);
                                    break;

                                    case WM_NOTIFICATION_RELEASED:
                                         app =true;
                                         for(i=0;i<5;i++)
                                             WM_DeleteWindow(SET_hImage);

                                         IS_Touch(true);
                                         Create_SetDesktop();
                                         app =false;
                                    break;
                                }
                     break;


                     case ID_SET_TIME:                  //时间设置
                            switch(pMsg ->Data.v)
                                {
                                  case WM_NOTIFICATION_CLICKED:
                           f_open(&bmp,"picture/set/time/_time.bmp",FA_READ);
                         IMAGE_SetBMPEx(SET_hImage[1],_Get_BackImage,(void *)&bmp);
                         f_close(&bmp);
                                    break;

                                    case WM_NOTIFICATION_RELEASED:
                       f_open(&bmp,"picture/set/time/time.bmp",FA_READ);
                         IMAGE_SetBMPEx(SET_hImage[1],_Get_BackImage,(void *)&bmp);
                         f_close(&bmp);
                                    break;
                                }
                     break;


                     case ID_SET_BKIMAGE:               //背景图片
                            switch(pMsg ->Data.v)
                                {
                                  case WM_NOTIFICATION_CLICKED:
                       f_open(&bmp,"picture/set/bkimage/_bkimage.bmp",FA_READ);
                         IMAGE_SetBMPEx(SET_hImage[2],_Get_BackImage,(void *)&bmp);
                         f_close(&bmp);
                                    break;

                                    case WM_NOTIFICATION_RELEASED:
                         f_open(&bmp,"picture/set/bkimage/bkimage.bmp",FA_READ);
                         IMAGE_SetBMPEx(SET_hImage[2],_Get_BackImage,(void *)&bmp);
                         f_close(&bmp);
                                    break;
                                }
                     break;


                     case ID_SET_HELP:                   //帮助
                            switch(pMsg ->Data.v)
                                {
                                  case WM_NOTIFICATION_CLICKED:
                       f_open(&bmp,"picture/set/help/_help.bmp",FA_READ);
                         IMAGE_SetBMPEx(SET_hImage[3],_Get_BackImage,(void *)&bmp);
                         f_close(&bmp);
                                    break;

                                    case WM_NOTIFICATION_RELEASED:
                       f_open(&bmp,"picture/set/help/help.bmp",FA_READ);
                         IMAGE_SetBMPEx(SET_hImage[3],_Get_BackImage,(void *)&bmp);
                         f_close(&bmp);
                                    break;            
                                }
                     break;


                     case ID_SET_EXIT:                   //返回
                            switch(pMsg ->Data.v)
                                {
                                    case WM_NOTIFICATION_CLICKED:
                       f_open(&bmp,"picture/set/exit/_exit.bmp",FA_READ);
                         IMAGE_SetBMPEx(SET_hImage[4],_Get_BackImage,(void *)&bmp);
                         f_close(&bmp);
                                    break;

                                  case WM_NOTIFICATION_RELEASED:
                                           app =false;
                       for(i=0;i<5;i++)
                                             WM_DeleteWindow(SET_hImage);
                                         Create_HomeDesktop();
                                    break;        
                                }                        
                     break;
                 }                     
        break;


        default:
            WM_DefaultProc(pMsg);
        break;
    }
}

void Create_SetDesktop()    //这里是创建5个IMAGE控件,然后在消息中设置IMAGE的bmp图片
{
    WM_SetCallback(WM_HBKWIN,_cbDialog);
    SET_hImage[0]= IMAGE_CreateEx(0, 20,240,30,WM_HBKWIN,WM_CF_SHOW,IMAGE_CF_TILE,ID_SET_TOUCH);
    SET_hImage[1]= IMAGE_CreateEx(0, 50,240,30,WM_HBKWIN,WM_CF_SHOW,IMAGE_CF_TILE,ID_SET_TIME);
    SET_hImage[2]= IMAGE_CreateEx(0, 80,240,30,WM_HBKWIN,WM_CF_SHOW,IMAGE_CF_TILE,ID_SET_BKIMAGE);
    SET_hImage[3]= IMAGE_CreateEx(0,110,240,30,WM_HBKWIN,WM_CF_SHOW,IMAGE_CF_TILE,ID_SET_HELP);
    SET_hImage[4]= IMAGE_CreateEx(0,140,240,30,WM_HBKWIN,WM_CF_SHOW,IMAGE_CF_TILE,ID_SET_EXIT);
}

    现在程序的状态是开机显示主界面,主界面有很多图标其中的设置图标被点击后调用Create_SetDesktop()切换到设置界面,设置界面就会创建以上5个IMAGE图标(用来做按钮),但是切换后只显示背景,IMAGE的BMP图标都没有显示出来,我在相应位置触摸是可以正常进入下一级菜单(本级菜单分别是触摸校验/时间设置/背景图片设置/帮助/返回),比如在触摸校验的位置触摸就可以正常进入触摸校验程序、触摸返回的位置就正常返回到了主界面,从这点可以说明IMAGE控件是正常被创建了,而且消息可以正常处理就是加载的图标不显示,请大家帮我看看是为什么?是不是IMAGE的控件少了哪些设置?我调试了IMAGE控件创建正常返回了句柄,f_open也正常读到了数据,就是 IMAGE_SetBMPEx()函数不能显示,如果我把IMAGE_SetBMPEx()全部换成GUI_BMP_DrawEx()就可以正常显示所有图标,但是这么做程序编写就不规范了。



回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115717
QQ
发表于 2016-9-2 09:20:48 | 显示全部楼层
使用这个函数 IMAGE_SetBMPEx是边读取边显示的方式实现的,且不可还没有读取完毕就调用f_close关闭了问题。

也就是把你的这个函数    f_close(&bmp);先注释掉。
回复

使用道具 举报

34

主题

83

回帖

185

积分

初级会员

积分
185
 楼主| 发表于 2016-9-2 09:37:59 | 显示全部楼层

回 eric2013 的帖子

eric2013:使用这个函数 IMAGE_SetBMPEx是边读取边显示的方式实现的,且不可还没有读取完毕就调用f_close关闭了问题。

也就是把你的这个函数    f_close(&bmp);先注释掉。 (2016-09-02 09:20) 
你好,不是这个问题哦。

首先一副完整的图片没有读取完成IMAGE_SetBMPEx()函数是不会退出的,当运行到f_close()函数时就已经表示IMAGE_SetBMPEx()函数内部已经完成了整副图片的加载,因为GUI_BMP_DrawEx()函数也需要回调函数多次加载图片,但是GUI_BMP_DrawEx()函数却能正常显示。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115717
QQ
发表于 2016-9-2 10:03:42 | 显示全部楼层

回 shuaigew88 的帖子

shuaigew88:你好,不是这个问题哦。

首先一副完整的图片没有读取完成IMAGE_SetBMPEx()函数是不会退出的,当运行到f_close()函数时就已经表示IMAGE_SetBMPEx()函数内部已经完成了整副图片的加载,因为GUI_BMP_DrawEx()函数也需要回调函数多次加载图片,但是GUI_BMP_DrawEx()函数却能正常显示。 (2016-09-02 09:37)
文件不可以关闭,因为你关闭之后,首次显示也许是正常的,以后就无法刷新此控件了,因为你已经将这个文件关闭了,没有图片数据来源了。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115717
QQ
发表于 2016-9-2 10:21:29 | 显示全部楼层
这里是个bug,这个函数IMAGE_SetBMPEx()调用一次就可以了,创建的时候调用一次就行,不要在WM_PAINT里再调用了,删掉,另外就是保证此函数IMAGE_SetBMPEx()能够正确读取数据,文件关闭了就无法读取了。
你的IMAG回调消息和WM_PAINT消息里面不需要重复的设置这个函数。

因为IMAG是个控件,自己会刷新。
回复

使用道具 举报

34

主题

83

回帖

185

积分

初级会员

积分
185
 楼主| 发表于 2016-9-2 10:27:15 | 显示全部楼层

回 eric2013 的帖子

eric2013:文件不可以关闭,因为你关闭之后,首次显示也许是正常的,以后就无法刷新此控件了,因为你已经将这个文件关闭了,没有图片数据来源了。

 (2016-09-02 10:03) 
我注释f_close()结果还是一样不能显示图片,
因为我图片是从外部存储器读取,所以显示必须要用户自己刷新,emWin内部不会自动管理
GUI_BMP_DrawEx()这个函数的性质跟IMAGE_SetBMPEx()函数一样,同样的直接替换成GUI_BMP_DrawEx()函数就可以正常显示BMP,而且当GUI需要刷新图标的时候就会发送WM_PAINT消息,就会重绘所有的位图,现在的问题是我单步调试进入WM_PAINT消息,然后单步运行
f_open(&bmp,"picture/set/touch/touch.bmp",FA_READ);
                     IMAGE_SetBMPEx(SET_hImage[0],_Get_BackImage,(void *)&bmp); //这里重绘第一个IMAGE图标,不能显示
             f_close(&bmp);

IMAGE_SetBMPEx(SET_hImage[0],_Get_BackImage,(void *)&bmp);//单步运行进入这个函数就会运行到我的回调函数读取图片,完整的图片被读取后返回在运行f_close(&bmp);之前 IMAGE_SetBMPEx(SET_hImage[0],_Get_BackImage,(void *)&bmp); 说明已经完整的读取了图片,就算以后读不到BMP图片,那么至少这个时候屏幕上面要显示BMP,但是单步运行屏幕没有显示,换成
GUI_BMP_DrawEx()函数单步运行同样跳转到回调函数读取图片,图片读取完成后返回 在运行f_close(&bmp);之前屏幕上已经正常显示图片了。所以说这两个函数刷新操作是必须要在WM_PAINT中完成,不像ICONVIEW_AddBitmapItem()这些函数创建之后需要保存位图流指针待GUI内部自动刷新管理。
回复

使用道具 举报

34

主题

83

回帖

185

积分

初级会员

积分
185
 楼主| 发表于 2016-9-2 10:29:05 | 显示全部楼层

回 eric2013 的帖子

eric2013:这里是个bug,这个函数IMAGE_SetBMPEx()调用一次就可以了,创建的时候调用一次就行,不要在WM_PAINT里再调用了,删掉,另外就是保证此函数IMAGE_SetBMPEx()能够正确读取数据,文件关闭了就无法读取了。
你的IMAG回调消息和WM_PAINT消息里面不需要重复的设置这个函数。

因为IMAG .. (2016-09-02 10:21)
你说这个是IMAGE的BUG吗?但是第一次也没有正常显示啊
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115717
QQ
发表于 2016-9-2 10:30:47 | 显示全部楼层

回 shuaigew88 的帖子

shuaigew88:你说这个是IMAGE的BUG吗?但是第一次也没有正常显示啊 (2016-09-02 10:29) 
你在这个函数里面
Create_SetDesktop
仅创建一个IMAG,然后再调用函数IMAGE_SetBMPEx一次,不要关闭文件。

试试是否正确。应该没问题的。
回复

使用道具 举报

34

主题

83

回帖

185

积分

初级会员

积分
185
 楼主| 发表于 2016-9-2 10:32:44 | 显示全部楼层

回 eric2013 的帖子

eric2013:你在这个函数里面
Create_SetDesktop
仅创建一个IMAG,然后再调用函数IMAGE_SetBMPEx一次,不要关闭文件。

....... (2016-09-02 10:30)
好的我试试,如果这样能显示那就说明这的确是个BUG了。
回复

使用道具 举报

34

主题

83

回帖

185

积分

初级会员

积分
185
 楼主| 发表于 2016-9-2 10:34:56 | 显示全部楼层

回 eric2013 的帖子

eric2013:你在这个函数里面
Create_SetDesktop
仅创建一个IMAG,然后再调用函数IMAGE_SetBMPEx一次,不要关闭文件。

....... (2016-09-02 10:30)
  谢谢,你说的没错的确像你说的这样。感谢
回复

使用道具 举报

34

主题

83

回帖

185

积分

初级会员

积分
185
 楼主| 发表于 2016-9-2 10:51:21 | 显示全部楼层

回 eric2013 的帖子

如果有什么问题在请教您,谢谢
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115717
QQ
发表于 2016-9-3 10:07:05 | 显示全部楼层

回 shuaigew88 的帖子

shuaigew88:如果有什么问题在请教您,谢谢 (2016-09-02 10:51) 
好的[s:142]

共同交流学习。
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-5-14 07:22 , Processed in 0.393808 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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