硬汉嵌入式论坛

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

[emWin教程入门篇] 【STemWin教程】第47章 LISTBOX-列表框控件

[复制链接]

740

主题

1326

回帖

3546

积分

管理员

春暖花开

Rank: 9Rank: 9Rank: 9

积分
3546
QQ
发表于 2015-3-6 10:51:43 | 显示全部楼层 |阅读模式
特别说明:完整STemWin的1-60期教程和配套实例下载地址:链接
第47章 LISTBOX-列表框控件

    本期教程讲解STemWin支持的列表框控件。
    47. 1 列表框控件介绍
    47. 2 官方WIDGET_ListBox实例
    47. 3 对话框上使用列表控件
    47. 4 总结
47.1 列表框控件介绍
    列表框用于选择列表的一个元素。创建的列表框可以没有环绕的框架窗口,如下所示,或者作为FRAMEWIN控件的子窗口建立。列表框中的项目被选定后,会突出显示。注意,所选项目的背景色取决于列表框窗口是否有输入焦点。
47.1.png


47.1.1 列表框支持的通知代码
    以下事件是列表框控件作为WM_NOTIFY_PARENT消息的一部分发送给其父窗口的:

消息

描述

WM_NOTIFICATION_CLICKED

列表框已被点击。

WM_NOTIFICATION_RELEASED

列表框已被释放。

WM_NOTIFICATION_MOVED_OUT

列表框已被点击,且指针已从列表框处移开,没有释放。

WM_NOTIFICATION_SCROLL_CHANGED

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

WM_NOTIFICATION_SEL_CHANGED

列表框的选择内容已更改。


47.2 官方WIDGET_ListBox实例
    官方的这个实例很好的演示了LISTBOX的使用,这个例子在模拟器中的位置:
47.2.png
源码如下(程序中进行了详细的注释):
  1. ----------------------------------------------------------------------
  2. File        : WIDGET_ListBox.c
  3. Purpose     : Example demonstrating the LISTBOX widget
  4. ----------------------------------------------------------------------
  5. */
  6. #include "GUI.h"
  7. #include "FRAMEWIN.h"
  8. #include "LISTBOX.h"
  9. #include <stddef.h>
  10. #define SPEED 1000
  11. /*******************************************************************
  12. *
  13. *       static variables
  14. *
  15. ********************************************************************
  16. */
  17. static const GUI_ConstString _ListBox[] = {
  18. "English", "Deutsch", NULL
  19. };
  20. /*******************************************************************
  21. *
  22. *       _ShowSeveralFunctions
  23. */
  24. static void _ShowSeveralFunctions(LISTBOX_Handle hListBox) {
  25.   int NumEntries, i;
  26.   /* 增加垂直滚动条 */
  27.   GUI_DispStringAtCEOL("SCROLLBAR_CreateAttached", 5, 55);
  28.   GUI_Delay(SPEED);
  29.   SCROLLBAR_CreateAttached(hListBox, SCROLLBAR_CF_VERTICAL);
  30.   GUI_Delay(SPEED * 0.75);
  31.   /* 增加字符串 */
  32.   GUI_DispStringAtCEOL("LISTBOX_AddString", 5, 55);
  33.   GUI_Delay(SPEED);
  34.   LISTBOX_AddString(hListBox, "Fran鏰is");
  35.   GUI_Delay(SPEED / 6);
  36.   LISTBOX_AddString(hListBox, "Japanese");
  37.   GUI_Delay(SPEED / 6);
  38.   LISTBOX_AddString(hListBox, "Italiano");
  39.   GUI_Delay(SPEED / 6);
  40.   LISTBOX_AddString(hListBox, "Espa駉l");
  41.   GUI_Delay(SPEED / 6);
  42.   LISTBOX_AddString(hListBox, "Other language ...");
  43.   GUI_Delay(SPEED * 0.6);
  44.   /* 设置输入焦点 */
  45.   GUI_DispStringAtCEOL("WM_SetFocus", 5, 55);
  46.   GUI_Delay(SPEED * 0.9);
  47.   WM_SetFocus(hListBox);
  48.   GUI_Delay(SPEED * 0.7);
  49.   /* 设置字体 */
  50.   GUI_DispStringAtCEOL("LISTBOX_SetFont", 5, 55);
  51.   GUI_Delay(SPEED * 0.9);
  52.   LISTBOX_SetFont(hListBox, &GUI_Font13B_1);
  53.   GUI_Delay(SPEED * 0.7);
  54.   /* 增加选项 */
  55.   GUI_DispStringAtCEOL("LISTBOX_IncSel", 5, 55);
  56.   GUI_Delay(SPEED);
  57.   NumEntries = LISTBOX_GetNumItems(hListBox);
  58.   for (i = 0; i < NumEntries - 1; i++) {
  59.     LISTBOX_IncSel(hListBox);
  60.     GUI_Delay(SPEED / 6);
  61. }
  62.   GUI_Delay(SPEED / 4);
  63.   /* 自动增加滚动条 */
  64.   GUI_DispStringAtCEOL("Optional automatic scrollbar", 5, 55);
  65.   GUI_Delay(SPEED);
  66.   LISTBOX_SetAutoScrollH(hListBox, 1);
  67.   LISTBOX_SetAutoScrollV(hListBox, 1);
  68.   GUI_Delay(SPEED * 0.75);
  69.   /* Set font */
  70.   /* 设置字体 */
  71.   GUI_DispStringAtCEOL("LISTBOX_SetFont", 5, 55);
  72.   GUI_Delay(SPEED);
  73.   LISTBOX_SetFont(hListBox, &GUI_Font16B_1);
  74.   GUI_Delay(SPEED * 0.75);
  75.   /* 递增选择 */
  76.   GUI_DispStringAtCEOL("LISTBOX_DecSel", 5, 55);
  77.   GUI_Delay(SPEED);
  78.   for (i = 0; i < NumEntries - 1; i++) {
  79.     LISTBOX_DecSel(hListBox);
  80.     GUI_Delay(SPEED / 6);
  81. }
  82.   GUI_Delay(SPEED / 4);
  83.   /* 更改滚动条的属性 */
  84.   GUI_DispStringAtCEOL("Change scrollbar width", 5, 55);
  85.   GUI_Delay(SPEED * 0.7);
  86.   {
  87. /* 得到滚动条的句柄 从而去修改滚动条的属性 */
  88.     SCROLLBAR_Handle hScrollH = WM_GetDialogItem(hListBox, GUI_ID_HSCROLL);
  89.     SCROLLBAR_Handle hScrollV = WM_GetDialogItem(hListBox, GUI_ID_VSCROLL);
  90.     SCROLLBAR_SetWidth(hScrollV, 14);
  91.     GUI_Delay(SPEED / 4);
  92.     SCROLLBAR_SetWidth(hScrollH, 14);
  93.     GUI_Delay(SPEED * 0.6);
  94.   }
  95.   /* 设置列表框的大小 */
  96.   GUI_DispStringAtCEOL("Change size of listbox", 5, 55);
  97.   GUI_Delay(SPEED * 0.75);
  98.   WM_ResizeWindow(hListBox, -15, 0);
  99.   GUI_Delay(SPEED / 4);
  100.   WM_ResizeWindow(hListBox, 0, -15);
  101.   GUI_Delay(SPEED / 4);
  102.   WM_ResizeWindow(hListBox, 15, 0);
  103.   GUI_Delay(SPEED / 4);
  104.   WM_ResizeWindow(hListBox, 0, 15);
  105.   GUI_Delay(SPEED / 2);
  106.   /* 设置相应的项目禁能 注意0是第一个项目 */
  107.   GUI_DispStringAtCEOL("LISTBOX_SetItemDisabled", 5, 55);
  108.   GUI_Delay(SPEED);
  109.   LISTBOX_SetItemDisabled(hListBox, 4, 1);
  110.   GUI_Delay(SPEED * 0.75);
  111.   /* 设置使能多个项目的选择 */
  112.   GUI_DispStringAtCEOL("LISTBOX_SetMulti", 5, 55);
  113.   GUI_Delay(SPEED);
  114.   LISTBOX_SetMulti(hListBox, 1);
  115.   GUI_Delay(SPEED * 0.75);
  116.   /* 选择项目 */
  117.   GUI_DispStringAtCEOL("LISTBOX_SetItemSel", 5, 55);
  118.   GUI_Delay(SPEED);
  119.   LISTBOX_SetItemSel(hListBox, 0, 1);
  120.   GUI_Delay(SPEED / 4);
  121.   LISTBOX_SetItemSel(hListBox, 1, 1);
  122.   GUI_Delay(SPEED / 4);
  123.   LISTBOX_SetItemSel(hListBox, 2, 1);
  124.   GUI_Delay(SPEED * 0.8);
  125.   /* 删除列表框 */
  126.   GUI_DispStringAtCEOL("LISTBOX_Delete", 5, 55);
  127.   GUI_Delay(SPEED * 1.1);
  128.   LISTBOX_Delete(hListBox);
  129.   GUI_Delay(SPEED * 0.75);
  130. }
  131. /*******************************************************************
  132. *
  133. *       _DemoListBox
  134. */
  135. static void _DemoListBox(void) {
  136.   LISTBOX_Handle hListBox;
  137.   /* 显示标题 */
  138.   GUI_SetBkColor(0xB00000);
  139.   GUI_SetColor(0xFFFFFF);
  140.   GUI_SetFont(&GUI_Font24_ASCII);
  141.   GUI_DispStringHCenterAt("Listbox - Sample", 160, 5);
  142.   GUI_Delay(SPEED / 2);
  143.   /* 创建列表框 */
  144.   GUI_SetFont(&GUI_Font8x16);
  145.   GUI_SetTextAlign(GUI_TA_LEFT);
  146.   GUI_DispStringAtCEOL("using", 5, 40);
  147.   GUI_DispStringAtCEOL("LISTBOX_Create", 5, 55);
  148.   GUI_Delay(SPEED * 0.9);
  149.   hListBox = LISTBOX_Create(_ListBox, 100, 80, 120, 115, WM_CF_SHOW);
  150.   GUI_Delay(SPEED * 0.75);
  151.   /* 功能演示 */
  152.   _ShowSeveralFunctions(hListBox);
  153.   /* Clear display */
  154.   GUI_Clear();
  155.   GUI_Delay(SPEED * 1.5);
  156. }
  157. /*******************************************************************
  158. *
  159. *       _DemoListBoxAsChild
  160. */
  161. static void _DemoListBoxAsChild(void) {
  162.   FRAMEWIN_Handle hFrame;
  163.   LISTBOX_Handle hListBox;
  164.   /* 显示标题 */
  165.   GUI_SetBkColor(0xB00000);
  166.   GUI_SetColor(0xFFFFFF);
  167.   GUI_SetFont(&GUI_Font24_ASCII);
  168.   GUI_DispStringHCenterAt("Listbox as child - Sample", 160, 5);
  169.   GUI_Delay(SPEED / 2);
  170.   /* 创建窗口框架 */
  171.   GUI_SetFont(&GUI_Font8x16);
  172.   GUI_SetTextAlign(GUI_TA_LEFT);
  173.   GUI_DispStringAtCEOL("using", 5, 40);
  174.   GUI_DispStringAtCEOL("FRAMEWIN_Create", 5, 55);
  175.   GUI_Delay(SPEED);
  176.   hFrame = FRAMEWIN_Create("List box", NULL, WM_CF_SHOW, 100, 80, 120, 140);
  177.   FRAMEWIN_SetFont(hFrame, &GUI_Font16B_ASCII);
  178.   FRAMEWIN_SetActive(hFrame, 1);
  179.   GUI_Delay(SPEED * 0.75);
  180.   /* 创建列表框 */
  181.   GUI_DispStringAtCEOL("LISTBOX_CreateAsChild", 5, 55);
  182.   GUI_Delay(SPEED);
  183.   /* 其实坐标0,0,水平和垂直的大小如果设置为0的话,那么将默认为父窗口的用户区大小 */
  184.   hListBox = LISTBOX_CreateAsChild(_ListBox, WM_GetClientWindow(hFrame), 0, 0, 0, 0, WM_CF_SHOW);
  185.   GUI_Delay(SPEED * 0.75);
  186.   _ShowSeveralFunctions(hListBox);
  187.   /* 删除框架窗口*/
  188.   GUI_DispStringAtCEOL("FRAMEWIN_Delete", 5, 55);
  189.   GUI_Delay(SPEED);
  190.   FRAMEWIN_Delete(hFrame);
  191.   GUI_Delay(SPEED * 0.75);
  192.   /* 清除显示 */
  193.   GUI_Clear();
  194.   GUI_Delay(SPEED * 1.5);
  195. }
  196. /*******************************************************************
  197. *
  198. *       MainTask
  199. *
  200. *       Demonstrates LISTBOX widget
  201. *
  202. ********************************************************************
  203. */
  204. void MainTask(void) {
  205.   GUI_Init();
  206.   WM_SetDesktopColor(0xB00000);
  207.   GUI_Exec();
  208.   while(1) {
  209.     _DemoListBox();
  210.     _DemoListBoxAsChild();
  211.   }
  212. }
复制代码
这个例子的实际现象效果如下:
47.3.png


47.3 对话框上使用列表框控件
    用uCGUIBulder4.0建立如下界面(分辨率480*272):
47.4.png

    为列表框添加成员的方法如下:
47.5.png

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


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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-16 16:05 , Processed in 0.165920 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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