硬汉嵌入式论坛

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

[emWin] STemWin的按钮图片从SD卡读取,显示在按钮的顶层,怎么实现?

[复制链接]

2

主题

13

回帖

19

积分

新手上路

积分
19
发表于 2019-6-28 11:17:44 | 显示全部楼层 |阅读模式
最近做一个界面菜单,要将按钮上绣上App小图标,之前使用流位图实现了,但是按钮多图片多占据较大内存!
现在case WM_PAINT:里面能将图片从SD卡读取出来显示,但是在按钮底层,想问一下如何将图片置顶,置于按钮上层?

回复

使用道具 举报

23

主题

1443

回帖

1512

积分

至尊会员

积分
1512
发表于 2019-6-28 12:25:11 | 显示全部楼层
按钮自定义回调的WM_PAINT ??
WM_PAINT会频繁的调用的,别在这个里面读取,最好申请动态内存提前搞好,不用时,释放掉比较合理。
代码不规范,亲人两行泪!
回复

使用道具 举报

2

主题

13

回帖

19

积分

新手上路

积分
19
 楼主| 发表于 2019-6-28 13:35:35 | 显示全部楼层
#define ID_WINDOW_0 (GUI_ID_USER + 0x00)
#define ID_BUTTON_0 (GUI_ID_USER + 0x05)
#define ID_BUTTON_1 (GUI_ID_USER + 0x06)

static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {
  { WINDOW_CreateIndirect, "Window", ID_WINDOW_0, 0, 0, 800, 480, 0, 0x0, 0 },
  { BUTTON_CreateIndirect, "Button", ID_BUTTON_0, 80,  50, 56, 56, 0, 0x0, 0 },
        { BUTTON_CreateIndirect, "Button", ID_BUTTON_1, 80, 100, 56, 56, 0, 0x0, 0 },
};

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_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;
        WM_HWIN hWin = pMsg->hWin;
  int NCode;
  int Id;
        
switch (pMsg->MsgId) {
        case WM_PAINT:
                        GUI_SetBkColor(GUI_RED);//ÉèÖõ±Ç°±³¾°É«
                        GUI_SetColor(GUI_RED);
//            GUI_SetFont(&GUI_FontHZ16);
                        break;
        case WM_INIT_DIALOG:
                        hItem = pMsg->hWin;
//          bmpdisplay_demo();
//                GUI_BMP_DrawEx("0:/PICTURE_bmp/app_110.bmp",0,50,        10);
        
                  GUI_UC_SetEncodeUTF8();//ÆôÓÃUTF8
      hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_0);
      BUTTON_SetText(hItem,"0:/bmp1/1.dta");
      BUTTON_SetSkin(hItem,BUTTON_DrawSkin);   
        
            hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_1);
      BUTTON_SetText(hItem,"exit");
//      BUTTON_SetSkin(hItem,BUTTON_DrawSkin);  
      break;
  case WM_NOTIFY_PARENT:
    Id    = WM_GetId(pMsg->hWinSrc);
    NCode = pMsg->Data.v;
    switch(Id) {
    case ID_BUTTON_0:
      switch(NCode) {
      case WM_NOTIFICATION_CLICKED:
        break;
      case WM_NOTIFICATION_RELEASED:
                                LED1 =~ LED1;
                                BEEP =~ BEEP;
        break;
      }
      break;
    case ID_BUTTON_1:
      switch(NCode) {
      case WM_NOTIFICATION_CLICKED:
        break;
      case WM_NOTIFICATION_RELEASED:
                                GUI_EndDialog(hWin, 0);
                                demo_desktop();
        break;
      }
      break;
    }
    break;
  default:
    WM_DefaultProc(pMsg);
    break;
  }
}


void bmp_play_why(void)
{
        WM_HWIN hWin;
        hWin = GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), _cbDialog, WM_HBKWIN, 0, 0);
}
回复

使用道具 举报

2

主题

13

回帖

19

积分

新手上路

积分
19
 楼主| 发表于 2019-6-28 13:37:00 | 显示全部楼层
missfox 发表于 2019-6-28 12:25
按钮自定义回调的WM_PAINT ??
WM_PAINT会频繁的调用的,别在这个里面读取,最好申请动态内存提前搞好,不 ...

实现了,如上:
回复

使用道具 举报

23

主题

1443

回帖

1512

积分

至尊会员

积分
1512
发表于 2019-6-28 15:03:11 | 显示全部楼层
克鲁格曼 发表于 2019-6-28 13:35
#define ID_WINDOW_0 (GUI_ID_USER + 0x00)
#define ID_BUTTON_0 (GUI_ID_USER + 0x05)
#define ID_BUTTO ...

强烈建议老铁把读出方式改了,先加载好,再放在回调里面绘制。
代码不规范,亲人两行泪!
回复

使用道具 举报

2

主题

13

回帖

19

积分

新手上路

积分
19
 楼主| 发表于 2019-6-28 15:32:45 | 显示全部楼层
missfox 发表于 2019-6-28 15:03
强烈建议老铁把读出方式改了,先加载好,再放在回调里面绘制。

内存不够啊,这样先加载会不会影响内存
回复

使用道具 举报

2

主题

13

回帖

19

积分

新手上路

积分
19
 楼主| 发表于 2019-6-28 17:09:51 | 显示全部楼层
missfox 发表于 2019-6-28 15:03
强烈建议老铁把读出方式改了,先加载好,再放在回调里面绘制。

老铁,这个读出加载好是把它先读出来放SRAM吗?
回复

使用道具 举报

23

主题

1443

回帖

1512

积分

至尊会员

积分
1512
发表于 2019-6-29 00:49:35 | 显示全部楼层
克鲁格曼 发表于 2019-6-28 17:09
老铁,这个读出加载好是把它先读出来放SRAM吗?

使用emwin的动态内存
代码不规范,亲人两行泪!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-18 03:10 , Processed in 0.251415 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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