前言
安卓系统上,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;
}
}
总结
这就完成了滑动列表控件的简单使用。