硬汉嵌入式论坛

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

[emWin] emwin函数GUI_BMP_DrawEx()能否读取带透明通道的BMP位图

[复制链接]

15

主题

74

回帖

119

积分

初级会员

积分
119
发表于 2019-12-24 10:37:07 | 显示全部楼层 |阅读模式
前段时间这个问题没解决去做别的了 现在又回到原点,还是一筹莫展,思路是在ICONVIEW控件的回电函数内WM_PAINT里边重绘图标,先画背景色,再画图标,但是画上图标后会将背景色遮挡,请问这个改怎么解决鸭.

带透明通道的bmp图片

带透明通道的bmp图片
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115785
QQ
发表于 2019-12-24 10:45:19 | 显示全部楼层
上代码看下。
回复

使用道具 举报

15

主题

74

回帖

119

积分

初级会员

积分
119
 楼主| 发表于 2019-12-24 11:00:05 | 显示全部楼层



  case WM_PAINT:
        if((0 == (ucLastSel%3))&&(1 == (ucLastSel - ucCurrSel)))//换行
        {
            ShowBMP(xHmiIconInfo[ucLastSel + 1].pcPath,xHmiIconInfo[ucLastSel + 1].x0,xHmiIconInfo[ucLastSel + 1].y0);
            ShowBMP(xHmiIconInfo[ucLastSel + 2].pcPath,xHmiIconInfo[ucLastSel + 2].x0,xHmiIconInfo[ucLastSel + 2].y0);
            ShowBMP(xHmiIconInfo[ucCurrSel - 1].pcPath,xHmiIconInfo[ucCurrSel - 1].x0,xHmiIconInfo[ucCurrSel - 1].y0);
            ShowBMP(xHmiIconInfo[ucCurrSel - 2].pcPath,xHmiIconInfo[ucCurrSel - 2].x0,xHmiIconInfo[ucCurrSel - 2].y0);
        }else if((0 == (ucCurrSel%3))&&(1 == (ucCurrSel - ucLastSel))){
            ShowBMP(xHmiIconInfo[ucCurrSel + 1].pcPath,xHmiIconInfo[ucCurrSel + 1].x0,xHmiIconInfo[ucCurrSel + 1].y0);
            ShowBMP(xHmiIconInfo[ucCurrSel + 2].pcPath,xHmiIconInfo[ucCurrSel + 2].x0,xHmiIconInfo[ucCurrSel + 2].y0);
            ShowBMP(xHmiIconInfo[ucLastSel - 1].pcPath,xHmiIconInfo[ucLastSel - 1].x0,xHmiIconInfo[ucLastSel - 1].y0);
            ShowBMP(xHmiIconInfo[ucLastSel - 2].pcPath,xHmiIconInfo[ucLastSel - 2].x0,xHmiIconInfo[ucLastSel - 2].y0);
        }else if(0xff == ucSel){//由参数界面进入或初次进入
            for(i = 0; i<ICON_MAX_SEL + 1; i++)
            {
                ShowBMP(xHmiIconInfo[ICON_MIN_SEL + i].pcPath,xHmiIconInfo[ICON_MIN_SEL + i].x0,xHmiIconInfo[ICON_MIN_SEL + i].y0);
            }
        }
        ucLastSel = ucCurrSel;
    break;





static void _IconCallback(WM_MESSAGE * pMsg)//只需判断用哪个字体就行
{
    WM_HWIN hWin;
    static unsigned char ucLastSel = 0;
    unsigned char i = 0;
    unsigned char ucCurrSel = 0;
    hWin = pMsg->hWin;
    switch(pMsg->MsgId)
    {
        case WM_PAINT:
            GUI_SetTextMode(GUI_TM_TRANS);
            if(CHINESE == INTEFFACE_GET_LANGUAGE()){
                GUI_SetDefaultFont(ulHmiIconFontChinese[ICON_DEFAULT_FONT]);
            }else if(ENGLISH == INTEFFACE_GET_LANGUAGE()){
                GUI_SetDefaultFont(ulHmiIconFontEnglish[ICON_DEFAULT_FONT]);
            }
            GUI_SetColor(GUI_RED);
            for(i = 0; i<ICON_MAX_SEL + 1; i++)
            {
                if(CHINESE == INTEFFACE_GET_LANGUAGE()){
                    GUI_DispStringAt(xHmiIconInfo[ICON_MIN_SEL + i].pcChinese, xHmiIconInfo[ICON_MIN_SEL + i].x0 , xHmiIconInfo[ICON_MIN_SEL + i].y0 + 48);
                }else if(ENGLISH == INTEFFACE_GET_LANGUAGE()){
                    GUI_DispStringAt(xHmiIconInfo[ICON_MIN_SEL + i].pcEnglish, xHmiIconInfo[ICON_MIN_SEL + i].x0 , xHmiIconInfo[ICON_MIN_SEL + i].y0 + 48);
                }
            }
            ucCurrSel = ICONVIEW_GetSel(hWin);
   if((ucCurrSel>=ICON_MIN_SEL) && (ucCurrSel<=ICON_MAX_SEL)){
    GUI_SetColor(GUI_YELLOW);
    GUI_FillRect(xHmiIconInfo[ucCurrSel].x0,xHmiIconInfo[ucCurrSel].y0,xHmiIconInfo[ucCurrSel].x1,xHmiIconInfo[ucCurrSel].y1);
    ShowBMP(xHmiIconInfo[ucLastSel].pcPath,xHmiIconInfo[ucLastSel].x0,xHmiIconInfo[ucLastSel].y0);
    ShowBMP(xHmiIconInfo[ucCurrSel].pcPath,xHmiIconInfo[ucCurrSel].x0,xHmiIconInfo[ucCurrSel].y0);
    ucLastSel = ucCurrSel;//
    GUI_SetTextMode(GUI_TM_TRANS);
    GUI_SetColor(GUI_BLUE);
    if(CHINESE == INTEFFACE_GET_LANGUAGE()){
                    GUI_DispStringAt(xHmiIconInfo[ucCurrSel].pcChinese, xHmiIconInfo[ucCurrSel].x0 , xHmiIconInfo[ucCurrSel].y0 + 48);
                }else if(ENGLISH == INTEFFACE_GET_LANGUAGE()){
                    GUI_DispStringAt(xHmiIconInfo[ucCurrSel].pcEnglish, xHmiIconInfo[ucCurrSel].x0 , xHmiIconInfo[ucCurrSel].y0 + 48);
                }
   }
        break;
        default:
            ICONVIEW_Callback(pMsg);
        break;
    }
}


在WINDOW的回调函数内的WM_PAINT使用bmp显示全部图标 在ICONVIEW回调函数内使用WM_PAINT重绘需要改变背景的图标 但是现在背景色会被覆盖,大佬指点下





回复

使用道具 举报

15

主题

74

回帖

119

积分

初级会员

积分
119
 楼主| 发表于 2019-12-24 11:00:26 | 显示全部楼层

已经上了 麻烦指点下
回复

使用道具 举报

5

主题

582

回帖

597

积分

版主

Rank: 7Rank: 7Rank: 7

积分
597
发表于 2019-12-24 11:22:45 | 显示全部楼层
如果不支持,转一转格式也很方便吧
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115785
QQ
发表于 2019-12-24 11:31:29 | 显示全部楼层
mmo 发表于 2019-12-24 11:00
case WM_PAINT:
        if((0 == (ucLastSel%3))&&(1 == (ucLastSel - ucCurrSel)))//换行
     ...

你这个是要实现什么功能,搞的这么复杂,仅仅是动态更改图标吗,使用流位图,调用函数

ICONVIEW_SetStreamedBitmapItem()。流位图存储到外部存储介质也是否方便。
回复

使用道具 举报

15

主题

74

回帖

119

积分

初级会员

积分
119
 楼主| 发表于 2019-12-24 11:37:21 | 显示全部楼层
eric2013 发表于 2019-12-24 11:31
你这个是要实现什么功能,搞的这么复杂,仅仅是动态更改图标吗,使用流位图,调用函数

ICONVIEW_SetSt ...

哎 一言难尽 由于使用的MCUflash有限,无法直接使用c文件,只能从sd卡内读取图片再显示
回复

使用道具 举报

15

主题

74

回帖

119

积分

初级会员

积分
119
 楼主| 发表于 2019-12-24 11:39:30 | 显示全部楼层
myxiaonia 发表于 2019-12-24 11:22
如果不支持,转一转格式也很方便吧

emmmm,试了下PNG的 FLASH不够了,PNG解码库太大,而且RAM也可能不够。。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115785
QQ
发表于 2019-12-24 11:53:00 | 显示全部楼层
mmo 发表于 2019-12-24 11:37
哎 一言难尽 由于使用的MCUflash有限,无法直接使用c文件,只能从sd卡内读取图片再显示

注意,我说的是流位图,不是位图,存到SD卡,NAND,eMMC,SPI Flash等均可。
回复

使用道具 举报

15

主题

74

回帖

119

积分

初级会员

积分
119
 楼主| 发表于 2019-12-24 13:07:07 | 显示全部楼层
eric2013 发表于 2019-12-24 11:53
注意,我说的是流位图,不是位图,存到SD卡,NAND,eMMC,SPI Flash等均可。

好 我看看
回复

使用道具 举报

15

主题

74

回帖

119

积分

初级会员

积分
119
 楼主| 发表于 2019-12-24 15:53:25 | 显示全部楼层
eric2013 发表于 2019-12-24 11:53
注意,我说的是流位图,不是位图,存到SD卡,NAND,eMMC,SPI Flash等均可。

哈哈哈哈 感谢大佬,问题基本解决了,不过申请的动态内存,不能在执行ICONVIEW_SetStreamedBitmapItem()后立即删除吗
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-18 10:04 , Processed in 0.385860 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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