硬汉嵌入式论坛

 找回密码
 立即注册
查看: 5568|回复: 0
收起左侧

[emWin教程入门篇] 【STemWin教程】第59章 LISTVIEW控件

[复制链接]

740

主题

1326

回帖

3546

积分

管理员

春暖花开

Rank: 9Rank: 9Rank: 9

积分
3546
QQ
发表于 2015-3-14 11:23:24 | 显示全部楼层 |阅读模式
特别说明:完整STemWin的1-60期教程和配套实例下载地址:链接
第59章 LISTVIEW控件


    本期教程讲解STemWin支持的LISTVIEW控件。
    59. 1 LISTVIEW控件介绍
    59. 2 官方WIDGET_ListView实例
    59. 3 使用官方GUIBulder建立ListView控件
    59. 3 总结

59.1 LISTVIEW控件介绍
    LISTVIEW控件可在具有多个列的列表中选择某个元素。由于LISTVIEW控件包含了一个HEADER控件,因此可对列加以管理。所创建的LISTVIEW既可以无环绕型框架窗口,也可以作为FRAMEWIN控件的一个子窗口。一旦选定列表视图中的项目,就会突出显示有关项目。需要注意的是,所选项目的背景颜色取决于LISTVIEW窗口是否具有输入焦点。下表显示的是LISTVIEW小工具的外观:
59.1.png
59.2.png


59.1.1 LISTVIEW支持的通知代码

    以下事件是LISTVIEW控件作为WM_NOTIFY_PARENT消息的一部分发送给其父窗口的:

消息

描述

WM_NOTIFICATION_CLICKED

已单击

WM_NOTIFICATION_RELEASED

已释放

WM_NOTIFICATION_MOVED_OUT

已单击小工具,并且指针已移出小工具,但没有释放

WM_NOTIFICATION_SCROLL_CHANGED

可选滚动条的滚动位置已更改

WM_NOTIFICATION_SEL_CHANGED

列表框的选择内容已更改


59.1.2 LISTVIEW支持的键盘反应

    如果控件具有输入焦点,则它将对下列各键做出反应:

按键

反应

GUI_KEY_UP

选择栏上移

GUI_KEY_DOWN

选择栏下移。

GUI_KEY_RIGHT

如果总列宽>列表视图的内部区域,则内容将滚动到左侧。

GUI_KEY_LEFT

如果总列宽>列表视图的内部区域,则内容将滚动到右侧。


59.2 官方WIDGET_ListView实例

    官方的这个实例很好的演示了ListView的使用,这个例子在模拟器中的位置:
59.3.png

源码如下(程序中进行了详细的注释)
  1. #include <stddef.h>
  2. #include <string.h>
  3. #include "GUI.h"
  4. #include "LISTVIEW.h"
  5. #include "FRAMEWIN.h"
  6. /*********************************************************************
  7. *
  8. *       Defines
  9. *
  10. **********************************************************************
  11. */
  12. #define SPEED 650
  13. #define MSG_CHANGE_MAIN_TEXT (WM_USER + 0)
  14. #define MSG_CHANGE_INFO_TEXT (WM_USER + 1)
  15. /*********************************************************************
  16. *
  17. *       Static data
  18. *
  19. **********************************************************************
  20. */
  21. static const GUI_COLOR Colors[]      = { 0, GUI_BLUE };
  22. static const GUI_LOGPALETTE Palette  = {
  23.   2,     /* bps */
  24.   1,     /* transparency */
  25.   Colors /* pointer to colors */
  26. };
  27. static const unsigned char acBarCode[] = {
  28.   _XXX_X__, XXX__XX_, X_X_X_XX, __X_XXX_, ________, ________, ________, ________, _XXX_X__, XXX__XX_, X_X_X_XX, __X_XXX_,
  29.   _XXX_X__, XXX__XX_, X_X_X_XX, __X_XXX_, ________, ________, ________, ________, _XXX_X__, XXX__XX_, X_X_X_XX, __X_XXX_,
  30.   _XXX_X__, XXX__XX_, X_X_X_XX, __X_XXX_, ________, ________, ________, ________, _XXX_X__, XXX__XX_, X_X_X_XX, __X_XXX_,
  31.   _XXX_X__, XXX__XX_, X_X_X_XX, __X_XXX_, ________, ________, ________, ________, _XXX_X__, XXX__XX_, X_X_X_XX, __X_XXX_,
  32.   _XXX_X__, XXX__XX_, X_X_X_XX, __X_XXX_, ________, ________, ________, ________, _XXX_X__, XXX__XX_, X_X_X_XX, __X_XXX_,
  33.   _XXX_X__, XXX__XX_, X_X_X_XX, __X_XXX_, ________, ________, ________, ________, _XXX_X__, XXX__XX_, X_X_X_XX, __X_XXX_,
  34.   _XXX_X__, XXX__XX_, X_X_X_XX, __X_XXX_, ________, ________, ________, ________, _XXX_X__, XXX__XX_, X_X_X_XX, __X_XXX_,
  35.   _XXX_X__, XXX__XX_, X_X_X_XX, __X_XXX_, ________, ________, ________, ________, _XXX_X__, XXX__XX_, X_X_X_XX, __X_XXX_,
  36.   _XXX_X__, XXX__XX_, X_X_X_XX, __X_XXX_, ________, ________, ________, ________, _XXX_X__, XXX__XX_, X_X_X_XX, __X_XXX_,
  37.   _XXX_X__, XXX__XX_, X_X_X_XX, __X_XXX_, ________, ________, ________, ________, _XXX_X__, XXX__XX_, X_X_X_XX, __X_XXX_,
  38. };
  39. static const GUI_BITMAP bmBarCode = { 96, 10, 12, 1, acBarCode, &Palette};
  40. static const char * _aTable_1[][3] = {
  41.   { "623499-0010001", "1", "Item 1" },
  42.   { "623499-0010002", "2", "Item 2" },
  43.   { "623499-0010003", "3", "Item 3" },
  44.   { "623499-0010004", "4", "Item 4" },
  45.   { "623499-0010005", "5", "Item 5" },
  46.   { "623499-0010006", "6", "Item 6" },
  47.   { "623499-0010007", "7", "Item 7" },
  48.   { "623499-0010008", "8", "Item 8" }
  49. };
  50. static const char * _aTable_2[][3] = {
  51.   { "111111-1111111", "100-A", "Item AAA" },
  52.   { "222222-2222222", "100-B", "Item BBB" },
  53.   { "333333-3333333", "100-C", "Item CCC" },
  54.   { "444444-4444444", "100-D", "Item DDD" },
  55.   { "555555-5555555", "100-E", "Item EEE" },
  56.   { "666666-6666666", "100-F", "Item FFF" },
  57.   { "777777-7777777", "100-G", "Item GGG" },
  58.   { "888888-8888888", "100-H", "Item HHH" }
  59. };
  60. static LISTVIEW_Handle _hListView;
  61. static char _acMainText[100];
  62. static char _acInfoText[100];
  63. /*******************************************************************
  64. *
  65. *       _ChangeMainText
  66. *
  67. *   用于给桌面窗口发自定义消息,并将桌面窗口无效,这样就可以出发桌面窗口回调函数
  68. *   的WM_PAINT消息。
  69. */
  70. static void _ChangeMainText(char* pStr) {
  71.   WM_MESSAGE Message;
  72.   Message.MsgId  = MSG_CHANGE_MAIN_TEXT;
  73.   Message.Data.p = pStr;
  74.   WM_SendMessage(WM_HBKWIN, &Message);
  75.   WM_InvalidateWindow(WM_HBKWIN);
  76. }
  77. /*******************************************************************
  78. *
  79. *       _ChangeInfoText
  80. *
  81. *   用于给桌面窗口发自定义消息,并将桌面窗口无效,这样就可以出发桌面窗口回调函数
  82. *   的WM_PAINT消息。
  83. */
  84. static void _ChangeInfoText(char* pStr) {
  85.   WM_MESSAGE Message;
  86.   Message.MsgId  = MSG_CHANGE_INFO_TEXT;
  87.   Message.Data.p = pStr;
  88.   WM_SendMessage(WM_HBKWIN, &Message);
  89.   WM_InvalidateWindow(WM_HBKWIN);
  90.   GUI_Delay(SPEED);
  91. }
  92. /*******************************************************************
  93. *
  94. *       _cbBkWindow
  95. */
  96. static void _cbBkWindow(WM_MESSAGE* pMsg) {
  97.   switch (pMsg->MsgId) {
  98.     case MSG_CHANGE_MAIN_TEXT:  //自定义消息
  99.       strcpy(_acMainText, (char const *)pMsg->Data.p);
  100.       WM_InvalidateWindow(pMsg->hWin);
  101.       break;
  102.     case MSG_CHANGE_INFO_TEXT:  //自定义消息
  103.       strcpy(_acInfoText, (char const *)pMsg->Data.p);
  104.       WM_InvalidateWindow(pMsg->hWin);
  105.       break;
  106.     case WM_PAINT:
  107.       GUI_SetBkColor(GUI_BLACK);
  108.       GUI_Clear();
  109.       GUI_SetColor(GUI_WHITE);
  110.       GUI_SetFont(&GUI_Font24_ASCII);
  111.       GUI_DispStringHCenterAt("LISTVIEW Widget - Sample", 160, 5);
  112.       GUI_SetFont(&GUI_Font8x16);
  113.       GUI_DispStringAt(_acMainText, 5, 40);
  114.       GUI_SetFont(&GUI_Font8x8);
  115.       GUI_DispStringAt(_acInfoText, 5, 60);
  116.       break;
  117.     default:
  118.       WM_DefaultProc(pMsg);
  119.   }
  120. }
  121. /*********************************************************************
  122. *
  123. *       _Demo
  124. */
  125. static void _Demo(void) {
  126.   unsigned int i;
  127.   unsigned int j;
  128.   int Key = 0;
  129.   int Cnt = 15;
  130.   char acInfoText[] = "-- sec to play with header control";
  131.   HEADER_Handle hHeader;
  132.   /* 得到LISTVIEW中的HEADER控件句柄 */
  133.   hHeader = LISTVIEW_GetHeader(_hListView);
  134.   WM_SetFocus(_hListView);
  135.   /* 演示LISTVIEW_AddColumn */
  136.   _ChangeInfoText("LISTVIEW_AddColumn");
  137.   LISTVIEW_AddColumn(_hListView, 100, "EAN",         GUI_TA_CENTER);
  138.   GUI_Delay(SPEED / 2);
  139.   LISTVIEW_AddColumn(_hListView,  50, "Order #\0x0", GUI_TA_CENTER);
  140.   GUI_Delay(SPEED / 2);
  141.   LISTVIEW_AddColumn(_hListView, 100, "Description", GUI_TA_CENTER);
  142.   GUI_Delay(SPEED / 2);
  143.   /* 演示SCROLLBAR_CreateAttached */
  144.   _ChangeInfoText("SCROLLBAR_CreateAttached");
  145.   SCROLLBAR_CreateAttached(_hListView, SCROLLBAR_CF_VERTICAL);
  146.   GUI_Delay(SPEED / 2);
  147.    /* 演示LISTVIEW_AddRow */
  148.   _ChangeInfoText("LISTVIEW_AddRow");
  149.   for (i = 0; i < GUI_COUNTOF(_aTable_1); i++) {
  150.     LISTVIEW_AddRow(_hListView, _aTable_1[i]);
  151.     GUI_Delay(SPEED / 3);
  152.   }
  153.    /* 演示LISTVIEW_IncSel */
  154.   _ChangeInfoText("LISTVIEW_IncSel");
  155.   for (i = 0; i < LISTVIEW_GetNumRows(_hListView); i++) {
  156.     LISTVIEW_IncSel(_hListView);
  157.     GUI_Delay(SPEED / 4);
  158.   }
  159.   GUI_Delay(SPEED / 4);
  160.   /* 演示LISTVIEW_DecSel */
  161.   _ChangeInfoText("LISTVIEW_DecSel");
  162.   for (i = 0; i < LISTVIEW_GetNumRows(_hListView); i++) {
  163.     LISTVIEW_DecSel(_hListView);
  164.     GUI_Delay(SPEED / 4);
  165.   }
  166.   GUI_Delay(SPEED / 4);
  167.   /* 演示LISTVIEW_SetTextAlign */
  168.   _ChangeInfoText("LISTVIEW_SetTextAlign");
  169.   LISTVIEW_SetTextAlign(_hListView, 0, GUI_TA_RIGHT);
  170.   GUI_Delay((int)(SPEED * 0.7));
  171.   /* 演示LISTVIEW_SetColumnWidth */
  172.   _ChangeInfoText("LISTVIEW_SetColumnWidth");
  173.   LISTVIEW_SetColumnWidth(_hListView, 1, 70);
  174.   GUI_Delay((int)(SPEED * 0.7));
  175.   /* 演示HEADER_SetTextColor */
  176.   _ChangeInfoText("HEADER_SetTextColor");
  177.   HEADER_SetTextColor(hHeader, GUI_BLUE);
  178.   GUI_Delay((int)(SPEED * 0.7));
  179.   /* 演示LISTVIEW_SetItemText */
  180.   _ChangeInfoText("LISTVIEW_SetItemText");
  181.   for (i = 0; i < GUI_COUNTOF(_aTable_2); i++) {
  182.     for (j = 0; j < GUI_COUNTOF(_aTable_2[i]); j++) {
  183.       LISTVIEW_SetItemText(_hListView, j, i, _aTable_2[i][j]);
  184.     }
  185.   }
  186.   GUI_Delay(SPEED / 2);
  187.   /* 演示LISTVIEW_SetBkColor */
  188.   _ChangeInfoText("LISTVIEW_SetBkColor");
  189.   LISTVIEW_SetBkColor(_hListView, 0, GUI_YELLOW);
  190.   GUI_Delay((int)(SPEED * 0.7));
  191.   /* 演示LISTVIEW_SetGridVis */
  192.   _ChangeInfoText("LISTVIEW_SetGridVis");
  193.   LISTVIEW_SetGridVis(_hListView, 1);
  194.   GUI_Delay((int)(SPEED * 0.7));
  195. /* 演示HEADER_SetHeight */
  196.   _ChangeInfoText("HEADER_SetHeight");
  197.   HEADER_SetHeight(hHeader, 30);
  198.   GUI_Delay((int)(SPEED * 0.7));
  199.   /* 演示HEADER_SetBitmap */
  200.   _ChangeInfoText("HEADER_SetBitmapEx");
  201.   HEADER_SetBitmap(hHeader, 0, &bmBarCode);
  202.   GUI_Delay((int)(SPEED * 0.7));
  203.    /* 等待一段时间,用于用户操作  */
  204.   while ((Key != GUI_KEY_ENTER) && (Cnt > 0)) {
  205.     acInfoText[0] = '0' + (Cnt / 10);
  206.     acInfoText[1] = '0' + (Cnt-- % 10);
  207.     _ChangeInfoText(acInfoText);
  208.     GUI_Delay(1000);
  209.     Key = GUI_GetKey();
  210.   }
  211. }
  212. /*********************************************************************
  213. *
  214. *       _DemoListView
  215. */
  216. static void _DemoListView(void) {
  217.   _ChangeMainText("LISTVIEW control without parent");
  218.   _ChangeInfoText("LISTVIEW_Create");
  219.   /* 创建LISTVIEW */
  220.   _hListView = LISTVIEW_Create(10, 80, 300, 89, 0, 1234, WM_CF_SHOW, 0);
  221.   GUI_Delay(SPEED / 2);
  222.   /* Demo演示 */
  223.   _Demo();
  224.   _ChangeInfoText("LISTVIEW_Delete");
  225.   /* 删除listview */
  226.   LISTVIEW_Delete(_hListView);
  227.   GUI_Delay(SPEED);
  228. }
  229. /*********************************************************************
  230. *
  231. *       MainTask
  232. */
  233. void MainTask(void) {
  234.   GUI_Init();
  235.   /* 使能桌面窗口使用内存设备 */
  236.   WM_EnableMemdev(WM_HBKWIN);
  237.    /* 使能所有其它窗口使用内存设备 */
  238.   WM_SetCreateFlags(WM_CF_MEMDEV);
  239.   /* 设置桌面窗口的回调函数 */
  240.   WM_SetCallback(WM_HBKWIN, _cbBkWindow);
  241.   GUI_CURSOR_Show();
  242.   while(1) {
  243.     _DemoListView();
  244.   }
  245. }
复制代码
实际显示效果如下:
59.4.png


59.3 使用官方GUIBulder建立LISTVIEW控件

    这里用GUIBulder5.22建立一个如下的界面(分辨率480*272):
59.5.png

在GUIBulder5.22上面创建LISTVIEW相对来说要麻烦一些,下面详细的跟大家创建一下:

59.3.1 第一步:添加LISTVIEW控件

    默认情况下,添加的LISTVIEW控件是一行三列,也就是一个ROW,三个Column。
59.6.png


59.3.2 第二步:添加第一行的三个元素

    添加方法如下:
59.7.png

每次点击左下角就会出现相应的设置选项,大家根据实际情况进行设置即可(也就是每个方格所在的Column和Row):
59.8.png


59.3.3 第三步:添加Column和Row

    Column和Row的添加方法如下:
59.9.png

    在这里,我们仅添加一行,添加后,设置右下角每个方格中的显示字符:
59.10.png

    最后将生成的代码直接复制到模拟器或者开发板上面运行,实际显示效果如下(生成的代码在本期教程配套的例子中):
59.11.png


59.4 总结

    本期教程主要是跟大家讲解了LISTVIEW控件的基础使用方法。希望大家可以把本期教程中讲的这两个例子跑跑,然后自己设计一个相关的例子进行试验学习。教程中只是使用了部分的LISTVIEW控件API,其它的API大家都可以试试。
努力打造安富莱高质量微信公众号:点击扫描图片关注
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-21 21:55 , Processed in 0.165427 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表