emWin学习(2)————滑动列表控件SWIPELIST

本文介绍了如何在emWin5.44版本中使用滑动列表控件SWIPELIST,展示了如何创建带有附加控件的滑动列表项,并通过用户交互控制显示内容。通过在滑动列表的每个项目中添加Windows控件,当点击这些控件时,可以识别并响应不同的操作。实验分析部分详细解释了代码实现过程,包括创建滑动列表、设置回调函数以及处理用户交互事件。
摘要由CSDN通过智能技术生成

前言

安卓系统上,QQ和微信的信息浏览都是可以通过上下滑动来快速浏览通知信息的,那emWin可以实现这样的效果吗?答案是肯定的。emWin5.32以上的版本就新增了滑动列表控件用来实现这样的效果。本文使用emWin5.44版本,简单演示滑动列表控件SWIPELIST的使用。

概述

滑动列表控件的使用与其他控件的使用类似,不同点需要我们认真阅读使用手册并且多加使用摸索。滑动列表控件的一个项目的结构如下所示:

控件是可以发送通知WM_NOTIFY_PARENT消息到其父窗口的,但是对键盘信息无反应,这点是要注意的。所以,如果用户需要使用外部按键控制选中项或者其他操作,可以使用自定义通知的方式来实现。

实验分析

(1)代码修改

在编写代码之前,有个问题需要我们想:假设我需要在滑动列表的单个Item里面添加其他控件,通过点击添加的控件来实现不同的效果,那么如何识别我点击的控件是哪一个呢?

我们可以这样做:首先,创建一个滑动列表控件,然后重新创建一个Windows控件并且附加到滑动列表控件,最后在这个Windows控件的回调函数里去创建其他额外控件,那么当我们点击这些额外控件时,对应的Windows回调函数里面就会收到消息,通过获取控件的ID就可以识别点击的是哪个控件了。

#define ID_SWIPELIST_WIN    (GUI_ID_USER + 0x01)
static const GUI_WIDGET_CREATE_INFO _aDialogCreate_SWIPELIST[] = {
    { WINDOW_CreateIndirect, "Window", ID_SWIPELIST_WIN, 0, 0, 470, 190, 0, 0x0, 0 },
};

static const char * _aPatients[][3] = {
    {
        "Sam",
        "18",
        "Male"
    },

    {
        "Jenny",
        "17",
        "Female"
    },

    {
        "Tony",
        "13",
        "Male"
    },

    {
        "Kenny",
        "17",
        "Male"
    },

    {
        "Fiona",
        "20",
        "Female"
    },
};
uint8_t g_ucID;
FlagStatus g_flagTest = RESET;

static void _cbSWIPELIST_Win(WM_MESSAGE * pMsg)
{
    TEXT_Handle hText, hName, hAge, hSex;
    IMAGE_Handle hImage0;
    char _buff[5];
    GUI_RECT _RectName = {200, 0, 300, 60};
    GUI_RECT _RectAge = {200, 60, 300, 120};
    GUI_RECT _RectSex = {200, 120, 300, 180};

    switch(pMsg->MsgId)
    {
        case WM_INIT_DIALOG:
            sprintf(_buff, "A%d%d", g_ucID/10, g_ucID%10);
            hText = TEXT_CreateEx(0, 0, 190, 190, pMsg->hWin, WM_CF_SHOW, TEXT_CF_HCENTER             
                    | TEXT_CF_VCENTER, (GUI_ID_USER + (g_ucID<<2) + g_ucID), _buff);
            TEXT_SetBkColor(hText, GUI_BLUE);
            TEXT_SetTextColor(hText, GUI_BLACK);
            TEXT_SetFont(hText, GUI_FONT_32B_ASCII);

            hName = TEXT_CreateEx(300, 0, 100, 60, pMsg->hWin, WM_CF_SHOW,     
                    TEXT_CF_HCENTER | TEXT_CF_VCENTER, (GUI_ID_USER + (g_ucID<<2) + 
                    g_ucID + 1), _aPatients[g_ucID][0]);
            TEXT_SetBkColor(hName, GUI_BLACK);
            TEXT_SetTextColor(hName, GUI_YELLOW);
            TEXT_SetFont(hName, GUI_FONT_32B_ASCII);

            hAge = TEXT_CreateEx(300, 60, 100, 60, pMsg->hWin, WM_CF_SHOW,     
                    TEXT_CF_HCENTER | TEXT_CF_VCENTER, (GUI_ID_USER + (g_ucID<<2) + 
                    g_ucID + 2), _aPatients[g_ucID][1]);
            TEXT_SetBkColor(hAge, GUI_BLACK);
            TEXT_SetTextColor(hAge, GUI_YELLOW);
            TEXT_SetFont(hAge, GUI_FONT_32B_ASCII);

            hSex = TEXT_CreateEx(300, 120, 100, 60, pMsg->hWin, WM_CF_SHOW,     
                    TEXT_CF_HCENTER | TEXT_CF_VCENTER, (GUI_ID_USER + (g_ucID<<2) + 
                    g_ucID + 3), _aPatients[g_ucID][2]);
            TEXT_SetBkColor(hSex, GUI_BLACK);
            TEXT_SetTextColor(hSex, GUI_YELLOW);
            TEXT_SetFont(hSex, GUI_FONT_32B_ASCII);

            hImage0 = IMAGE_CreateEx(410, 10, 50, 50, pMsg->hWin, WM_CF_SHOW, 
                      IMAGE_CF_AUTOSIZE, GUI_ID_IMAGE0);
            IMAGE_SetBitmap(hImage0, &bmMuteOff);
        break;

        case WM_NOTIFY_PARENT:
            if(pMsg->Data.v == WM_NOTIFICATION_RELEASED)
            {
                int Id = WM_GetId(pMsg->hWinSrc);
                switch(Id)
                {
                    case (GUI_ID_USER):
                        if(g_flagTest == RESET)
                        {
                            g_flagTest = SET;
                            IMAGE_SetBitmap(WM_GetDialogItem(pMsg->hWin, (GUI_ID_USER + 
                            4)), &bmMuteOn);
                        }
                        else
                        {
                            g_flagTest = RESET;
                            IMAGE_SetBitmap(WM_GetDialogItem(pMsg->hWin, (GUI_ID_USER + 
                            4)), &bmMuteOff);
                        }
                    break;
                }
            }
        break;

        case WM_PAINT:
            GUI_SetBkColor(GUI_BLACK);
            GUI_Clear();

            GUI_SetColor(GUI_WHITE);
            GUI_SetFont(GUI_FONT_32B_ASCII);
            GUI_SetTextMode(GUI_TEXTMODE_TRANS);
            GUI_DispStringInRect("Name:", &_RectName, GUI_TA_LEFT | GUI_TA_VCENTER);
            GUI_DispStringInRect("Age:", &_RectAge, GUI_TA_LEFT | GUI_TA_VCENTER);
            GUI_DispStringInRect("Sex:", &_RectSex, GUI_TA_LEFT | GUI_TA_VCENTER);
        break;

        default:
            WM_DefaultProc(pMsg);
        break;
    }
}

//创建SWIPELIST控件
static void _cbSWIPELIST_Test(WM_MESSAGE * pMsg)
{
    WM_HWIN hWin = pMsg->hWin;
    SWIPELIST_Handle hSWIPELIST0;
    WM_HWIN hSWIPELIST_Win;

    switch(pMsg->MsgId)
    {
        case WM_CREATE:
            SWIPELIST_SetDefaultBkColor(SWIPELIST_CI_BK_ITEM_SEL, GUI_BLACK);
            SWIPELIST_SetDefaultBkColor(SWIPELIST_CI_BK_SEP_ITEM, GUI_YELLOW);
            SWIPELIST_SetDefaultFont(SWIPELIST_FI_SEP_ITEM, GUI_FONT_32B_ASCII);
            SWIPELIST_SetDefaultTextColor(SWIPELIST_CI_SEP_ITEM_TEXT, GUI_BLACK);
            SWIPELIST_SetDefaultTextAlign(GUI_TA_HCENTER | GUI_TA_VCENTER);

            hSWIPELIST0 = SWIPELIST_CreateEx(0, 0, 480, 500, hWin, WM_CF_SHOW, 0, 0);
            WM_MOTION_SetMoveable(hSWIPELIST0, WM_CCF_MOTION_Y, 1);

            for(uint8_t i=0;i<5;i++)
            {
                SWIPELIST_AddItem(hSWIPELIST0, " ", 200);
                hSWIPELIST_Win = GUI_CreateDialogBox(_aDialogCreate_SWIPELIST, 
                                 GUI_COUNTOF(_aDialogCreate_SWIPELIST),                 
                                 _cbSWIPELIST_Win, _hLastFrame, 0, 0);
                SWIPELIST_ItemAttachWindow(hSWIPELIST0, i, hSWIPELIST_Win, 0, 5);
                g_ucID++;
            }
            SWIPELIST_SetScrollPosItem(hSWIPELIST0, 3);//默认选中Item3
        break;

        case WM_PAINT:
            GUI_SetBkColor(GUI_BLACK);
            GUI_Clear();
        break;

        default:
            WM_DefaultProc(pMsg);
        break;
    }
}



总结

这就完成了滑动列表控件的简单使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值