下拉框(Dropdown)控件是一种用于在列表中选择一个或多个元素的控件,我们经常会在网页或者手机APP中见到这种控件。 下拉框控件默认会处于非展开状态并显示当前选定的项目,如果用户点击展开了下拉框控件,则会出现一个列表供用户选择新的项目。
下拉框控件默认开启皮肤色,外观如图 下拉框外观 所示。
下拉框控件支持5种通知代码,以区分各种不同的操作动作,见表格 下拉框控件支持的通知代码 。
这5种通知代码是作为WM_NOTIFY_PARENT消息的一部分发送到其父窗口的。当用户点击按钮后, 窗口管理器会让下拉框向父窗口发送WM_NOTIFY_PARENT消息,并且会在消息结构的Data.v成员中附加相应的通知代码, 用户程序可以读取此成员来检测不同的按钮动作以及实现各种功能。
同时下拉框控件也支持输入焦点,它可以接收如表格 下拉框支持的按键消息 所示的按键消息。
24.1. 创建下拉框控件
24.1.1. 下拉框控件API
24.1.2. 下拉框控件创建函数
24.1.2.1. DROPDOWN_CreateEx()
在指定位置创建指定大小的下拉框控件。
代码清单:下拉框-1 函数原型
DROPDOWN_Handle DROPDOWN_CreateEx(int x0, int y0, int xSize, int ySize,
WM_HWIN hParent, int WinFlags, int
ExFlags, int Id);
-
x0: 下拉框控件在父坐标中的最左侧像素;
-
y0: 下拉框控件在父坐标中的最顶侧像素;
-
xSize: 下拉框非展开状态的水平尺寸,以像素为单位;
-
ySize: 下拉框非展开状态的垂直尺寸,以像素为单位;
-
hParent: 父窗口句柄。如果为0,则将桌面窗口作为其父窗口;
-
WinFlags: 窗口创建标志。由于控件本质上是窗口,所以下拉框控件在创建时可以使用几乎所有的窗口创建标志。 这些标志中按钮最常用的是WM_CF_SHOW。全部创建标志请参考emWin手册的窗口管理器章节;
-
ExFlags: 下拉框额外的创建标志,可选值见表格 ExFlags可选值 ;
-
Id: 控件ID号。
返回值:创建成功后返回已创建的下拉框控件句柄,创建失败则返回0。
24.1.2.2. DROPDOWN_CreateIndirect()
从对话框资源表中创建下拉框控件。
代码清单:下拉框-2对话框方式创建下拉框函数
DROPDOWN_Handle DROPDOWN_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参数的可选值与表格 ExFlags可选值 相同。
24.2. 下拉框控件基础实验
接下来我们来讲解如何以对话框的方式间接创建一个下拉框控件,通过API函数直接创建的实验可参考官方例程WIDGET_Dropdown.c,例程路径如下:
SeggerEval_WIN32_MSVC_MinGW_GUI_V548\Sample\Tutorial\WIDGET_Dropdown.c
24.2.1. 代码分析
24.2.1.1. 创建对话框
代码清单:下拉框-3 创建对话框(DropdownDLG.c文件)
/* 控件ID */
#define ID_FRAMEWIN_0 (GUI_ID_USER + 0x00)
#define ID_DROPDOWN_0 (GUI_ID_USER + 0x01)
#define ID_DROPDOWN_1 (GUI_ID_USER + 0x02)
#define ID_TEXT_0 (GUI_ID_USER + 0x03)
/* 资源表 */
static const GUI_WIDGET_CREATE_IN