硬汉嵌入式论坛

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

[emWin] 使用iconview,做竖屏的滑屏显示

[复制链接]

1

主题

2

回帖

27

积分

新手上路

积分
27
发表于 2018-6-1 18:18:46 | 显示全部楼层 |阅读模式
新学emwin,nxp的项目,想使用iconview做一个可以竖屏显示大概两三页的程序,而且可以做竖屏的滑屏操作。
请问各位大神有什么指导?
我自己写了一个,想法是建立一个iconview含有60多个图片,创建一个mdev用来存储,通过滑屏操作以及mdev的坐标来显示不同的内容到屏幕上,目前不能滑屏操作,屏幕也没有改变,如下:
#include "DIALOG.h"
#include "MenuManager.h"
#include "KeyBoard.h"

extern GUI_CONST_STORAGE GUI_BITMAP bmaddbtn;

#define ID_WINDOW_0  (GUI_ID_USER + 0x00)

#define ID_PROGBAR_0  (GUI_ID_USER + 0x02)
#define ID_TEXT_0  (GUI_ID_USER + 0x03)
#define ID_LISTBOX_0  (GUI_ID_USER + 0x07)
#define ID_TEXT_2  (GUI_ID_USER + 0x0D)
#define ID_ICONVIEW_0  (GUI_ID_USER + 0x0E)

static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {
  { WINDOW_CreateIndirect, "AddDeviceWindow", ID_WINDOW_0, 0, 0, 480, 272, 0, 0x0, 0 },
  { PROGBAR_CreateIndirect, "Progbar", ID_PROGBAR_0, 445, 2, 30, 20, 0, 0x0, 0 },
  { TEXT_CreateIndirect, "Text", ID_TEXT_0, 188, 3, 80, 20, 0, 0x64, 0 },
  { TEXT_CreateIndirect, "<", ID_TEXT_2, 7, 7, 41, 21, 0, 0x0, 0 },

  { LISTBOX_CreateIndirect, "Listbox", ID_LISTBOX_0, 400, 27, 80, 92, 0, 0x0, 0 },
};
static const GUI_WIDGET_CREATE_INFO _aDialogCreate1[] = {
{ ICONVIEW_CreateIndirect, "Iconview", ID_ICONVIEW_0, 30, 29, 480,  272*3, 0, 0x00400040, 0 },
};

const GUI_ConstString ListBox[] =
{
   "Delete","Rename",NULL
};

static GUI_MEMDEV_Handle hMemIconV;
static GUI_MEMDEV_Handle hMemWork;
static ICONVIEW_Handle hIconV;
static WM_HWIN hWinChild;

static LISTBOX_Handle hListBox;
static int bShowList = 0;

static uint32_t  y0 = 0;

static void _cbDialog(WM_MESSAGE * pMsg) {
  GUI_MEMDEV_Handle   hMemOld;
  WM_HWIN hItem;
  int     NCode;
  int     Id;
        static uint32_t  tStart, tEnd;

  switch (pMsg->MsgId) {
  case MSG_KEYBOARD_CPL:
          if (KeyboardGetString())
          {
                  PRINTF("MSG_KEYBOARD_CPL :%s\n",KeyboardGetString());
                  hItem = WM_GetDialogItem(pMsg->hWin, ID_ICONVIEW_0);
                  int nums = ICONVIEW_GetNumItems(hItem);
                  int sel = ICONVIEW_GetSel(hItem);
                  ICONVIEW_SetItemText(hItem, sel, KeyboardGetString());
                  if ((sel+1) == nums)
                  {
                          PRINTF("MSG_KEYBOARD_CPL :1\n");
                          ICONVIEW_AddBitmapItem(hItem, &bmaddbtn, "New");
                  }

                  GUI_Exec();
          }
          break;

  case WM_INIT_DIALOG:
    hItem = pMsg->hWin;
    WINDOW_SetBkColor(hItem, GUI_MAKE_COLOR(0x00525143));

    hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_0);
    TEXT_SetTextColor(hItem, GUI_MAKE_COLOR(0x00FFFFFF));
    TEXT_SetTextAlign(hItem, GUI_TA_HCENTER | GUI_TA_VCENTER);
    TEXT_SetText(hItem, "Device manager");

    //
    // Initialization of '<'
    //
    hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_2);
    TEXT_SetTextColor(hItem, GUI_MAKE_COLOR(0x00FFFFFF));
    TEXT_SetTextAlign(hItem, GUI_TA_HCENTER | GUI_TA_VCENTER);

    hListBox = WM_GetDialogItem(pMsg->hWin, ID_LISTBOX_0);
    LISTBOX_SetBackColor(hListBox,0,GUI_BLUE);
    LISTBOX_SetBackColor(hListBox,1,GUI_LIGHTBLUE);
    LISTBOX_SetTextColor(hListBox,0,GUI_WHITE);
    LISTBOX_SetFont(hListBox,&GUI_Font16B_1);
    LISTBOX_AddString(hListBox, "Delete");
    LISTBOX_AddString(hListBox, "Rename");
    WM_HideWindow(hListBox);
    bShowList = 0;

        GUI_SetColor(0x00FFFFFF);
        GUI_AA_DrawLine(0,28,480,28);

    break;
  case WM_NOTIFY_PARENT:
    Id    = WM_GetId(pMsg->hWinSrc);
    NCode = pMsg->Data.v;
    switch(Id) {
    case ID_ICONVIEW_0: // Notifications sent by 'Iconview'
              switch(NCode) {
              case WM_NOTIFICATION_CLICKED:
                tStart = GUI_GetTime();
                PRINTF("tStart:%d\r\n", tStart);
                break;
              case WM_NOTIFICATION_RELEASED:
                      {}
              case WM_NOTIFICATION_MOVED_OUT:
                break;
              case WM_NOTIFICATION_SCROLL_CHANGED:
                break;
              case WM_NOTIFICATION_SEL_CHANGED:
                break;
              }
              break;
    }
    break;
  default:
    WM_DefaultProc(pMsg);
    break;
  }
}


static void _cbchildWin(WM_MESSAGE * pMsg) {
        WM_MOTION_INFO * pInfo;
  GUI_MEMDEV_Handle   hMemOld;
  WM_HWIN hItem;
  int     NCode;
  int     Id;

  // USER START (Optionally insert additional variables)
  // USER END

  switch (pMsg->MsgId) {
  case WM_MOTION:
        //WM_GetUserData(hWin, &pPara, sizeof(pPara));
        pInfo = (WM_MOTION_INFO *)pMsg->Data.p;
        //PRINTF("WM_MOTION pInfo->Cmd;%d\r\n", pInfo->Cmd);
        switch (pInfo->Cmd)
        {
                case WM_MOTION_INIT:
                        pInfo->Flags =  WM_CF_MOTION_Y | WM_MOTION_MANAGE_BY_WINDOW;
                        pInfo->SnapX = 1;
                        break;

                case WM_MOTION_MOVE:
                        //WM_MoveTo(hWin, pPara->Pos, 0);
                        y0-=30;       
                        if(y0 < -1000)
                                y0 += 30;
                        PRINTF("WM_MOTION_MOVE :%d\n", y0);
                        //
                        break;
                case WM_MOTION_GETPOS:
                        //pInfo->xPos = pPara->Pos;
                        break;
                case WM_MOTION_GETCONTEXT:
                        #if 0
                        y0-=30;       
                        PRINTF("WM_PAINT :%d\n", y0);
                        WM_MoveTo(hWinChild, 0, y0);
                        #endif
                        break;
        }
                  
    break;
  case WM_PRE_PAINT:
              //PRINTF("WM_PRE_PAINT\r\n");
    GUI_MULTIBUF_Begin();
    break;
  case WM_POST_PAINT:
              //PRINTF("WM_POST_PAINT\r\n");
    GUI_MULTIBUF_End();
    break;
       
  case WM_PAINT:
        PRINTF("WM_PAINT\r\n");

        //GUI_ClearRect(0,_aDialogCreate[4].y0, LCD_GetXSize(), LCD_GetYSize()-_aDialogCreate[4].y0);
        GUI_DrawGradientV(0,1, LCD_GetXSize(), LCD_GetYSize()-_aDialogCreate1[0].y0,GUI_BLACK, GUI_RED);
        #if 1
        //WM_MoveTo(hWinChild, 0, y0);
        //GUI_MEMDEV_SetOrg(hMemIconV, 0, y0);
        GUI_MEMDEV_WriteAt(hMemIconV, 0,_aDialogCreate1[0].y0+100);
        #else
        hMemOld = GUI_MEMDEV_Select(hMemIconV);
        GUI_MEMDEV_SetOrg(hMemIconV, 0, y0);
        GUI_MEMDEV_Select(hMemWork);
        GUI_MEMDEV_WriteAt(hMemIconV, 0, 0);
        GUI_MEMDEV_Select(hMemOld);
        GUI_MEMDEV_WriteAt(hMemWork, 0,_aDialogCreate1[0].y0);
        #endif
        //WM_MoveTo(hWinChild, 0, y0);

        break;


  default:
    WM_DefaultProc(pMsg);
    break;
  }
}
/*********************************************************************
*
*       Public code
*
**********************************************************************
*/
void CreateIconView(void)
{
        GUI_SetBkColor(GUI_TRANSPARENT);
        GUI_Clear();

        hIconV = ICONVIEW_CreateEx(10,10,_aDialogCreate1[0].xSize,_aDialogCreate1[0].ySize, hWinChild, WM_CF_SHOW | WM_CF_HASTRANS, 0, GUI_ID_ICONVIEW0, 64, 64);

        ICONVIEW_SetBkColor(hIconV, ICONVIEW_CI_UNSEL, GUI_MAKE_COLOR(0x00525143));
        ICONVIEW_SetBkColor(hIconV, ICONVIEW_CI_SEL, GUI_MAKE_COLOR(0x00525143));
        ICONVIEW_SetIconAlign(hIconV, ICONVIEW_IA_TOP);
        ICONVIEW_SetTextColor(hIconV, ICONVIEW_CI_UNSEL, GUI_WHITE);
        ICONVIEW_SetTextColor(hIconV, ICONVIEW_CI_SEL, GUI_GREEN);
        ICONVIEW_SetFrame(hIconV, GUI_COORD_X, 0);
        ICONVIEW_SetFrame(hIconV, GUI_COORD_Y, 0);
        ICONVIEW_SetSpace(hIconV, GUI_COORD_X, 0);//(350-64*4)/3);
        ICONVIEW_SetSpace(hIconV, GUI_COORD_Y, 0);//(200-64*2)/1);
        ICONVIEW_SetFont(hIconV, GUI_FONT_16_1);
       
        int index = 0;
        for(;index < 60; ++index){
        char buf[6];
        sprintf(buf,"%s%d","STB", index);
        ICONVIEW_AddBitmapItem(hIconV, &bmaddbtn, buf);
        }
        ICONVIEW_AddBitmapItem(hIconV, &bmaddbtn, "TV");

        ICONVIEW_AddBitmapItem(hIconV, &bmaddbtn, "New");
}
/*********************************************************************
*
*       CreateAddDeviceWindow
*/
WM_HWIN CreateDevListMngDLG(void);
WM_HWIN CreateDevListMngDLG(void) {
        WM_HWIN hWin;

        WM_SetSize(WM_HBKWIN, LCD_GetXSize(), LCD_GetYSize());

        hWin = GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), _cbDialog, WM_HBKWIN, 0, 0);

        hWinChild = WM_CreateWindowAsChild(
                0,
                _aDialogCreate1[0].y0,
                LCD_GetXSize(),
                LCD_GetYSize()*2,
                WM_HBKWIN, WM_CF_SHOW | WM_CF_MOTION_Y, _cbchildWin, 100//sizeof(PARA *)
                );
        WM_MOTION_SetDefaultPeriod(20);
        WM_MOTION_SetMoveable(hWinChild, WM_CF_MOTION_Y, 1);
        WM_MOTION_SetMotion(hWinChild, GUI_COORD_Y, 500, 200);
        WM_MOTION_SetMovement(hWinChild, GUI_COORD_Y, 1000, 100);

      hMemIconV = GUI_MEMDEV_CreateFixed(
                0,
                0,//_aDialogCreate1[0].y0,
                _aDialogCreate1[0].xSize,
                LCD_GetYSize()*2-_aDialogCreate1[0].y0-1,
    GUI_MEMDEV_NOTRANS, GUI_MEMDEV_APILIST_32, GUICC_8888
                );
        if (hMemIconV == 0) {
                PRINTF("hMemIconV null\r\n");
                //return 1;
        }
          
        GUI_MEMDEV_Select(hMemIconV);
        CreateIconView();
        GUI_MEMDEV_Select(0);
          PRINTF("CreateDevListMngDLG\r\n");
       
#if 0
    hMemWork = GUI_MEMDEV_CreateFixed(
    0,
    0,//_aDialogCreate1[0].y0,
    LCD_GetXSize(),
    LCD_GetYSize()*3,
    GUI_MEMDEV_NOTRANS, GUI_MEMDEV_APILIST_32, GUICC_8888
  );
  if (hMemWork == 0) {
          PRINTF("hMemWork null\r\n");
    //return 1;
  }

#endif       

  return hWin;
}

// USER START (Optionally insert additional public code)
// USER END

/*************************** End of file ****************************/

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107145
QQ
发表于 2018-6-2 01:41:58 | 显示全部楼层
可以参考这个例子实现,有视频效果演示

http://www.armbbs.cn/forum.php?m ... &extra=page%3D1
回复

使用道具 举报

1

主题

2

回帖

27

积分

新手上路

积分
27
 楼主| 发表于 2018-6-4 09:24:01 | 显示全部楼层
你的demo很强大,你是指主界面的滑动操作吗? 我是想做一个相当于图片的浏览,可以上下移动,想用一个iconview做,行得通吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107145
QQ
发表于 2018-6-4 15:45:27 | 显示全部楼层
fisker 发表于 2018-6-4 09:24
你的demo很强大,你是指主界面的滑动操作吗? 我是想做一个相当于图片的浏览,可以上下移动,想用一个iconv ...

是类型手机的照片滑动浏览吗
回复

使用道具 举报

1

主题

2

回帖

27

积分

新手上路

积分
27
 楼主| 发表于 2018-6-4 16:47:29 | 显示全部楼层
嗯  比如像进入所有照片,可以通过上下移动切到不同的页面。  (照片是可以删除和添加的,这块是动态的,数量不固定)
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107145
QQ
发表于 2018-6-5 03:48:13 | 显示全部楼层
fisker 发表于 2018-6-4 16:47
嗯  比如像进入所有照片,可以通过上下移动切到不同的页面。  (照片是可以删除和添加的,这块是动态的,数 ...

可以把这个天气预报的例子改改:

http://www.armbbs.cn/forum.php?m ... C%C6%F8%D4%A4%B1%A8
回复

使用道具 举报

21

主题

125

回帖

188

积分

初级会员

积分
188
发表于 2018-6-7 11:14:19 | 显示全部楼层
eric2013 发表于 2018-6-5 03:48
可以把这个天气预报的例子改改:

http://www.armbbs.cn/forum.php?mod=viewthread&tid=12062&highl ...

天气那个,至少需要多大的RAM,小于一整屏可以么?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107145
QQ
发表于 2018-6-7 19:48:07 | 显示全部楼层
kirito 发表于 2018-6-7 11:14
天气那个,至少需要多大的RAM,小于一整屏可以么?

最好使用F429加SDRAM,这样就不需要担心RAM问题了。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-20 11:31 , Processed in 0.233165 second(s), 31 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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