图标(Iconview)控件可用来设置基于图标的菜单,这些菜单在手机和电脑上非常常见,使用也很频繁。 它可以显示图标列表,其中每个图标都可以选择使用文本标记。 图标控件支持透明度和Alpha混合,因此桌面背景可以不受遮挡的显示内容。 当前被选中的图标可以用纯色或alpha混合效果突出显示。如有需要还可以使用滚动条显示更多图标。
图标控件没有固定外观,具体显示什么样的内容完全由用户决定,不过它的结构是不变的, 例如带透明度的图标控件如图 带透明度的图标控件样式 所示。
图标控件支持5种通知代码,以区分各种不同的操作动作,见表格 图标控件支持的通知代码 。
这5种通知代码是作为WM_NOTIFY_PARENT消息的一部分发送到其父窗口的。当用户点击按钮后, 窗口管理器会让图标控件向父窗口发送WM_NOTIFY_PARENT消息,并且会在消息结构的Data.v成员中附加相应的通知代码, 用户程序可以读取此成员来检测不同的按钮动作以及实现各种功能。
同时图标控件也支持输入焦点,它可以接收如所示的按键消息。
30.1. 创建图标控件
30.1.1. 图标控件API
30.1.2. 图标控件创建函数
30.1.2.1. ICONVIEW_CreateEx()
在指定位置创建指定大小的图标控件。
代码清单:图标-1 函数原型
ICONVIEW_Handle ICONVIEW_CreateEx(int x0, int y0, int xSize, int ySize,
WM_HWIN hParent, int WinFlags, int
ExFlags, int Id, int xSizeItems, int
ySizeItems);
-
x0: 图标控件在父坐标中的最左侧像素;
-
y0: 图标控件在父坐标中的最顶侧像素;
-
xSize: 图标控件的水平尺寸,以像素为单位;
-
ySize: 图标控件的垂直尺寸,以像素为单位;
-
hParent: 父窗口句柄。如果为0,则将桌面窗口作为其父窗口;
-
WinFlags: 窗口创建标志。由于控件本质上是窗口,所以图标控件在创建时可以使用几乎所有的窗口创建标志。 这些标志中按钮最常用的是WM_CF_SHOW。全部创建标志请参考emWin手册的窗口管理器章节;
-
ExFlags: 额外创建标志,用于选择是否使用滚动条;
-
Id: 控件ID号;
-
xSizeItem: 单个图标的水平尺寸,以像素为单位;
-
ySizeItem: 单个图标的垂直尺寸,以像素为单位。
返回值:创建成功后返回已创建的图标控件句柄,创建失败则返回0。
30.1.2.2. ICONVIEW_CreateIndirect()
从对话框资源表中创建图标控件。
代码清单:图标-2 函数原型
ICONVIEW_Handle ICONVIEW_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参数分为高16位和低16位, 分别对应ySizeItem和xSizeItem。其中的Flags参数可选值与ICONVIEW_CreateEx()函数的ExFlags参数相同,用于设置是否启用滚动条。
30.1.3. 图标制作
图标控件所用图标的制作过程与控件贴图和显示位图的有些许不同,我们讲解一下专用于这个控件的图标制作步骤。
- 添加图像文件。 点击File->Open添加一张PNG格式的图标文件,也可直接将图片拖到转换器空白处添加,见图 添加PNG文件 ;
- 保存C文件。 点击File->Save As,在弹出来的保存对话框中,选择需要保存的路径,这里我们保存到图标文件夹, 修改文件名,选择保存类型为.C文件。见图 保存C文件 ;
3) 选择C文件的颜色格式。 在保存对话框中点击确定后,会弹出一个选择颜色格式的窗口,这里我们选择High color with Alpah(565),见图 选择颜色格式 。
通过上述步骤,即可成功制作1个PNG格式图标的C数组文件。如果需要生成.dta格式的流位图,在保存文件时选择保存类型为.dta文件即可。
而背景图片通常由于分辨率比较高、色彩深度较大等原因,制作出来的C文件体积会很大,根本无法放进芯片的内部FLASH中。 对于背景图片,建议的做法是将图片源文件存放在外部FLASH或SD卡中,系统启动时再加载到RAM,这样就不用担心内部FLASH空间不足的问题了。
30.2. 图标控件基础实验
接下来我们通过一个实验来讲解如何创建一个只包含基本功能的图图标控件,完整的图标控件演示实验可参考官方例程WIDGET_Iconview.c,例程路径如下:
SeggerEval_WIN32_MSVC_MinGW_GUI_V548\Sample\Tutorial\WIDGET_IconView
30.2.1. 代码分析
本实验与其他实验稍有不同,由于图标控件自身特性的限制,使用对话框的方式间接创建出来的图标控件整体效果不太好,所以这次实验我们使用直接创建的方式。
30.2.1.1. MainTask函数
既然是用直接方式创建图标控件,那就不再需要对话框资源表了,直接在GUI主任务中创建,见 代码清单:图标-3 。
代码清单:图标-3 MainTask函数(IconviewDLG.c文件)
/* 引用图像数据 */
extern GUI_CONST_STORAGE GUI_BITMAP bmsetting;
extern GUI_CONST_STORAGE GUI_BITMAP bmclock;
extern GUI_CONST_STORAGE GUI_BITMAP bmcalender;
extern GUI_CONST_STORAGE GUI_BITMAP bmmusic;
extern GUI_CONST_STORAGE GUI_BITMAP bmmessege