硬汉嵌入式论坛

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

[有问必答] STM32F407 emWin Button按钮显示外置内存图片问题

[复制链接]

1

主题

0

回帖

3

积分

新手上路

积分
3
发表于 2015-4-22 16:09:05 | 显示全部楼层 |阅读模式
STM32F407 emWin Button按钮显示外置内存图片问题;
QQ图片20150422160831.png

具体问题在emWin开发教程手册里面,这个问题现在是否已经解决了?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117542
QQ
发表于 2015-4-22 16:14:46 | 显示全部楼层
暂时还没有解决。
回复

使用道具 举报

58

主题

119

回帖

293

积分

高级会员

积分
293
发表于 2015-4-30 22:44:49 | 显示全部楼层

回 eric2013 的帖子

eric2013:暂时还没有解决。 (2015-04-22 16:14)
版主,按钮设置外置图片搞出来吗?
回复

使用道具 举报

58

主题

119

回帖

293

积分

高级会员

积分
293
发表于 2015-4-30 23:16:19 | 显示全部楼层

回 eric2013 的帖子

eric2013:暂时还没有解决。 (2015-04-22 16:14)
/*************************************
*
*读取图片,作为按钮显示用
*
**************************************/
//读取图片,不释放句柄
uint8_t SetStreamBMPButton(char *file_name,BUTTON_Handle hButton,int x0,int y0)
{   
    FRESULT res;
    uint32_t bw=0;   
    GUI_BITMAP * bitMap;
    GUI_LOGPALETTE  palette;
    hMem=GUI_ALLOC_AllocNoInit(1024*100);//申请内存块
    picBuffer=GUI_ALLOC_h2p(hMem);//取得申请内存块的地址
    hMem1=GUI_ALLOC_AllocNoInit(1024*100);//申请内存块
    bitMap=GUI_ALLOC_h2p(hMem1);//取得申请内存块的地址
    res=f_open(&picNotRel,file_name,FA_OPEN_EXISTING|FA_READ|FA_OPEN_ALWAYS);//打开文件
    if(res!=FR_OK)
    {
        return 1;
    }
//    do
    res=f_read(&picNotRel,picBuffer,picNotRel.fsize,&bw);//将文件读到内存中
    if(res!=FR_OK)
    {
        return 1;
    }
    GUI_CreateBitmapFromStream(bitMap,&palette,picBuffer);
    BUTTON_SetBitmap(hButton,BUTTON_BI_UNPRESSED,bitMap);
    GUI_ALLOC_Free(hMem1);
    GUI_ALLOC_Free(hMem);
}

这样可以显示,但是内存不能释放,释放后显示不正常,重绘会很快就内存崩溃了。求版主改进。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117542
QQ
发表于 2015-4-30 23:33:27 | 显示全部楼层

回 yuanfp 的帖子

yuanfp:/*************************************
*
*读取图片,作为按钮显示用
*
....... (2015-04-30 23:16) 
非常感谢兄弟提供。[s:151]
回复

使用道具 举报

0

主题

8

回帖

8

积分

新手上路

积分
8
发表于 2015-6-26 08:53:43 | 显示全部楼层

回 yuanfp 的帖子

yuanfp:/*************************************
*
*读取图片,作为按钮显示用
*
....... (2015-04-30 23:16) 
请问这个问题解决了没?我也遇到了这个问题
回复

使用道具 举报

0

主题

8

回帖

8

积分

新手上路

积分
8
发表于 2015-6-26 10:26:26 | 显示全部楼层

回 yuanfp 的帖子

yuanfp:

/*************************************
*
*读取图片,作为按钮显示用
*
.......
用按钮重绘就可以解决这个问题了。

//按钮重绘
FIL picture_bmp_fsrc_temp;
static int BUTTON_DrawSkin(const WIDGET_ITEM_DRAW_INFO *pDrawItemInfo)
{
    char  s[20];
    GUI_HMEM hMem;
    GUI_HMEM hMem1;
    u32 bw=0;
    char *_acBuffer;
    GUI_BITMAP * bitMap;
    GUI_LOGPALETTE  palette;
    switch(pDrawItemInfo->Cmd)
    {
//        case WIDGET_ITEM_DRAW_BACKGROUND:
//            
//        break;
        case WIDGET_ITEM_DRAW_TEXT:
            BUTTON_GetText(pDrawItemInfo->hWin,s,20);   
            hMem=GUI_ALLOC_AllocZero(5*1024);
            _acBuffer=GUI_ALLOC_h2p(hMem);
            hMem1=GUI_ALLOC_AllocZero(5*1024);
            bitMap=GUI_ALLOC_h2p(hMem1);

            f_open(&picture_bmp_fsrc_temp,s,FA_OPEN_EXISTING | FA_READ | FA_OPEN_ALWAYS);   
            f_read(&picture_bmp_fsrc_temp,_acBuffer,picture_bmp_fsrc_temp.fsize,&bw);
            GUI_CreateBitmapFromStream(bitMap,&palette,_acBuffer);   
            GUI_DrawBitmap(bitMap,0,0);
            f_close(&picture_bmp_fsrc_temp);        
            GUI_ALLOC_Free(hMem);
            GUI_ALLOC_Free(hMem1);

        break;
        case WIDGET_ITEM_CREATE:

        break;
        default:
            return BUTTON_DrawSkinFlex(pDrawItemInfo);
    }
    return 0;
}


static void _cbDialog(WM_MESSAGE * pMsg) {
  WM_HWIN hItem;
  int     NCode;
  int     Id;
   
  switch (pMsg->MsgId) {
  case WM_INIT_DIALOG:
    //
    // Initialization of 'Edit'
    //
        GUI_UC_SetEncodeUTF8();
        hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_0);
        BUTTON_SetText(hItem,"0:/bmp1/1.dta");
        BUTTON_SetSkin(hItem,BUTTON_DrawSkin);   
    break;
}
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117542
QQ
发表于 2015-6-26 17:01:13 | 显示全部楼层

回 zwh751279833 的帖子

zwh751279833:用按钮重绘就可以解决这个问题了。

//按钮重绘
FIL picture_bmp_fsrc_temp;
....... (2015-06-26 10:26) 
好思路。
测试将dta放在nor flash也很方便,不需要重复申请和释放动态内存了。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-13 19:03 , Processed in 0.057225 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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