列表轮(Listwheel)控件在造型和使用上非常类似于安卓的那种选择日期和时间的控件,控件的整个数据区域可通过指针输入设备(PID)进行移动, 在数据区域移动的时候释放PID设备,数据区域会减慢运动速度,并通过在吸附位置捕捉一个新项目来停止。此外,列表轮控件的数据可以循环显示, 在最后一个数据项之后,会像一个轮子一样继续显示第一个数据项。
列表轮控件可以使用用户绘制机制加上Alpha混合做出很复杂美观的效果,如图 列表轮控件美化后的外观 所示,emwin默认的控件外观是很扁平很普通的。
列表轮控件支持4种通知代码,以区分各种不同的操作动作,见表格 列表轮支持的通知代码 。
这4种通知代码是作为WM_NOTIFY_PARENT消息的一部分发送到其父窗口的。当用户点击列表轮后, 窗口管理器会让表格控件向父窗口发送WM_NOTIFY_PARENT消息,并且会在消息结构的Data.v成员中附加相应的通知代码, 用户程序可以读取此成员来检测不同的控件动作以及实现各种功能。列表轮控件不支持任何的按键消息。
26.1. 创建列表轮控件
26.1.1. 列表轮控件API
26.1.2. 列表轮控件创建函数
26.1.2.1. LISTWHEEL_CreateEx()
在指定位置创建指定大小的列表轮控件。
代码清单:列表轮-1 函数原型
LISTWHEEL_Handle LISTWHEEL_CreateEx(int x0, int y0, int xSize, int
ySize, WM_HWIN hParent, int
WinFlags, int ExFlags, int Id,
const GUI_ConstString *ppText);
-
x0: 列表轮控件在父坐标中的最左侧像素;
-
y0: 列表轮控件在父坐标中的最顶侧像素;
-
xSize: 列表轮的水平尺寸,以像素为单位;
-
ySize: 列表轮的垂直尺寸,以像素为单位;
-
hParent: 父窗口句柄。如果为0,则将桌面窗口作为其父窗口;
-
WinFlags: 窗口创建标志。由于控件本质上是窗口,所以列表轮控件在创建时可以使用几乎所有的窗口创建标志。 这些标志中按钮最常用的是WM_CF_SHOW。全部创建标志请参考emWin手册的窗口管理器章节;
-
ExFlags: 预留,未使用;
-
Id: 控件ID号;
-
ppText: 指向包含要显示的元素的字符串指针数组的指针。
返回值:创建成功后返回已创建的表格控件句柄,创建失败则返回0。如果使用参数ppText,则数组的最后一个元素需要为NULL。
26.1.2.2. LISTWHEEL_CreateIndirect()
从对话框资源表中创建滑块控件。
代码清单:列表轮-2 函数原型
LISTWHEEL_Handle LISTWHEEL_CreateIndirect(const GUI_WIDGET_CREATE_INFO
*pCreateInfo, WM_HWIN
hWinParent, int x0, int y0,
WM_CALLBACK *cb);
-
pCreateInfo: 指向GUI_WIDGET_CREATE_INFO结构的指针;
-
hParent: 父窗口的句柄;
-
x0: 列表轮控件在父坐标中的最左边像素;
-
y0: 列表轮控件在父坐标中的最顶部像素;
-
cb: 回调函数指针。
此函数的第一个参数指向的是 代码清单:控件基础-3 的资源表结构,但不使用其中的para参数, 其中的Flags参数的可选值与LISTWHEEL_CreateEx()函数的WinFlags参数相同。
26.2. 列表轮基础实验
接下来我们来讲解如何以对话框的方式间接创建一个列表轮控件,通过API函数直接创建的实验可参考官方例程MEMDEV_ListWheelEffects,例程路径如下:
SeggerEval_WIN32_MSVC_MinGW_GUI_V548\Sample\Tutorial\MEMDEV_ListWheelEffects
26.2.1. 代码分析
26.2.1.1. 创建对话框
代码清单:列表轮-3 创建对话框(ListwheelDLG.c文件)
/* 控件ID */
#define ID_FRAMEWIN_0 (GUI_ID_USER + 0x00)
#define ID_LISTWHEEL_0 (GUI_ID_USER + 0x01)
#define ID_LISTWHEEL_1 (GUI_ID_USER + 0x02)
#define ID_LISTWHEEL_2 (GUI_ID_USER + 0x03)
/* 资源表 */
static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {
{
FRAMEWIN_CreateIndirect, "Framewin", ID_FRAMEWIN_0, 0, 0, 800,
480, 0, 0x0, 0 },
{