30. 图标控件

您所在的位置:网站首页 苹果手机怎么加插件到桌面显示图标 30. 图标控件

30. 图标控件

2024-07-15 07:45| 来源: 网络整理| 查看: 265

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文件)¶ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81/* 引用图像数据 */ 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; extern GUI_CONST_STORAGE GUI_BITMAP bmfolder; extern GUI_CONST_STORAGE GUI_BITMAP bmnotebook; extern GUI_CONST_STORAGE GUI_BITMAP bmsearch; extern GUI_CONST_STORAGE GUI_BITMAP bmhome; extern GUI_CONST_STORAGE GUI_BITMAP bmimage; /* 用于图标的创建 */ typedef struct { const GUI_BITMAP *pBitmap; const char *pText; } BITMAP_ITEM; static BITMAP_ITEM _abitmapItem[] = { {&bmhome, "home"}, {&bmfolder, "folder"}, {&bmclock, "Clock"}, {&bmmessege, "messege"}, {&bmcalender, "calender"}, {&bmsearch, "search"}, {&bmmusic, "music"}, {&bmimage, "image"}, {&bmsetting, "Setting"}, }; /** * @brief GUI主任务 * @note 无 * @param 无 * @retval 无 */ void MainTask(void) { U8 i; WM_HWIN hWin; /* 加载BMP图片数据到内存设备 */ LoadBMP_UsingMEMDEV("0:/image/wallpaper.bmp"); /* 在指定位置创建ICONVIEW控件 */ hWin = ICONVIEW_CreateEx(30, /* 相对于父窗口坐标的最左像素 */ 20, /* 相对于父窗口坐标的最上像素 */ 770, /* 水平尺寸 */ 272, /* 垂直尺寸 */ WM_HBKWIN, /* 父窗口句柄 */ WM_CF_SHOW | WM_CF_HASTRANS,/* 窗口创建标志 */ 0, /* 不设置自动滚动条 */ ID_ICONVIEW_0, /* 控件ID */ 64, /* 单个图标的水平尺寸 */ 64 + 16); /* 单个图标的垂直尺寸 */ /* 向控件中添加新图标 */ for (i = 0; i Data.v; switch (id) { case ID_ICONVIEW_0: switch (NCode) { case WM_NOTIFICATION_CLICKED: break; case WM_NOTIFICATION_RELEASED: switch (ICONVIEW_GetSel(pMsg->hWinSrc)) { case 0: FUN_ICON0Clicked(); break; default: break; } break; } break; } break; default: WM_DefaultProc(pMsg); break; } }

WM_PAINT消息

背景图片在回调函数的WM_PAINT消息中绘制。因为之前的MainTask函数中已经把背景图片加载到内存设备中了, 所以现在我们只需要调用GUI_MEMDEV_WriteOpaqueAt函数即可很快的将背景图片显示出来。 同样的,这里目前大家不需要了解其中的具体细节,之后会在图片显示章节详细讲解。

WM_NOTIFY_PARENT消息

WM_NOTIFY_PARENT消息和对话框方式的处理方法相同,在此消息中以控件ID来区分各个不同的控件。 首先使用ICONVIEW_GetSel函数获取当前被点击图标的索引号,接着根据这个索引号, 去调用相应的应用窗口创建函数FUN_ICON0Clicked。所有图标对应的窗口创建函数都在此处调用, 由于篇幅所限,我们只展示了第一个“home”图标的创建函数。

其他消息

所有我们不关心或者没有用到的系统消息都可以调用默认消息处理函数WM_DefaultProc进行处理。

30.2.1.3. 应用窗口创建函数¶ 代码清单:图标-5 应用窗口创建函数(IconviewDLG.c文件)¶ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35/** * @brief 应用窗口创建函数 * @note 无 * @param 无 * @retval 无 */ static void FUN_ICON0Clicked(void) { WM_HWIN hWin; WM_HWIN hChild; WM_HWIN hText; /* 创建框架窗口 */ hWin = FRAMEWIN_CreateEx(100, /* 相对于父窗口坐标的最左像素 */ 20, /* 相对于父窗口坐标的最上像素 */ 600, /* 水平尺寸 */ 400, /* 垂直尺寸 */ WM_HBKWIN, /* 父窗口句柄 */ WM_CF_SHOW, /* 窗口创建标志 */ 0, /* 额外创建标志 */ ID_FRAMEWIN_0,/* 控件ID */ "", /* 标题栏文本 */ &_cbICON0); /* 客户窗口回调函数 */ FRAMEWIN_SetFont(hWin, GUI_FONT_24B_1); FRAMEWIN_SetText(hWin, "HOME"); FRAMEWIN_AddCloseButton(hWin, FRAMEWIN_BUTTON_RIGHT, 0); /* 设置为模态窗口 */ WM_MakeModal(hWin); /* 获取客户窗口句柄 */ hChild = WM_GetClientWindow(hWin); /* 在客户窗口中创建子控件 */ hText = TEXT_CreateEx(0, 0, 180, 34, hChild, WM_CF_SHOW, 0, ID_TEXT_0, "HOME APP"); TEXT_SetFont(hText, GUI_FONT_32B_1); TEXT_SetTextColor(hText, GUI_WHITE); }

如 代码清单:图标-5 所示,新应用窗口的创建依然使用FRAMEWIN_CreateEx函数进行直接创建, 有关此函数的介绍见17.1.2。然后是设置标题栏字体为24B、文本为“HOME”,并且添加一个关闭按钮。最后, 通过WM_MakeModal函数把这个窗口设置为模态窗口,这样的话只有窗口内部的范围对触摸动作有反应, 窗口外部的其他控件不会响应触摸动作,可在一定程度上避免误触。

在第17章 中我们提到过,框架窗口有主窗口和客户窗口两部分,并且句柄是分开的,子控件放在客户窗口上。 所以使用WM_GetClientWindow函数先获取客户窗口的句柄,然后再在这基础上添加子控件。

应用窗口的回调函数如 代码清单:图标-6 所示。

代码清单:图标-6 应用窗口回调函数(IconviewDLG.c文件)¶ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19/** * @brief 应用窗口回调函数 * @note 无 * @param 无 * @retval 无 */ static void _cbICON0(WM_MESSAGE *pMsg) { switch (pMsg->MsgId) { case WM_PAINT: /* 设置客户窗口的背景颜色 */ GUI_SetBkColor(GUI_LIGHTGRAY); GUI_Clear(); break; default: WM_DefaultProc(pMsg); break; } }

应用窗口内子控件的行为逻辑就由回调函数_cbICON0进行处理,如 代码清单:图标-6 所示, 我们在回调函数的WM_PAINT消息中使用GUI_SetBkColor函数设置客户窗口的背景颜色。子控件的WM_NOTIFY_PARENT消息也是在这个回调函数中处理。

30.2.2. 实验现象¶

图标控件基础实验现象如图 图标控件实验初始状态 和图 点击home图标后的现象 所示, 图 图标控件实验初始状态 是图标控件的初始状态,效果与手机和平板电脑上的很类似, 图 点击home图标后的现象 是图标被点击后的现象。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3