硬汉嵌入式论坛

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

[emWin教程入门篇] 【STemWin教程】第42章 DROPDOWN-下拉列表控件

[复制链接]

740

主题

1326

回帖

3546

积分

管理员

春暖花开

Rank: 9Rank: 9Rank: 9

积分
3546
QQ
发表于 2015-2-28 10:32:10 | 显示全部楼层 |阅读模式
特别说明:完整STemWin的1-60期教程和配套实例下载地址:链接
第42章 DROPDOWN-下拉列表控件

    本期教程讲解STemWin支持的下拉列表。
    42. 1 下拉列表控件介绍
    42. 2 官方WIDGET_Dropdown实例
    42. 3 对话框上使用下拉列表控件
    42. 4 总结

42.1 下拉列表控件介绍
    DROPDOWN控件用于从具有若干栏的列表中选择一个元素,它以非打开状态显示当前选择的项目。如果用户打开DROPDOWN控件,就会出现一个选择新项目的LISTBOX。
42.1.png

    设置皮肤后显示效果如下:
42.2.png


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

消息

描述

WM_NOTIFICATION_CLICKED

已被点击。

WM_NOTIFICATION_RELEASED

已被释放。

WM_NOTIFICATION_MOVED_OUT

已被点击,且指针已移出控件,但没有释放。

WM_NOTIFICATION_SCROLL_CHANGED

已打开的下拉列表小工具的可选滚动条的滚动位置已改变。

WM_NOTIFICATION_SEL_CHANGED

下拉列表的选择已更改。


42.1.2 下拉列表支持的键盘反应
    如果控件具有输入焦点,则它将对下列各键做出反应:

按键

反应

GUI_KEY_SPACE

切换小工具的选中状态

GUI_KEY_ENTER

从打开的下拉列表中选择项目,然后关闭列表


42.2 官方WIDGET_Dropdown实例
    官方的这个例子做的很好,充分的演示了下拉列表的大部分常用API。这个例子在模拟器中的位置:
42.3.png

源代码如下:
  1. #include "GUI.h"
  2. #include "FRAMEWIN.h"
  3. #include "DROPDOWN.h"
  4. #include "LISTBOX.h"
  5. #include <stddef.h>
  6. /*********************************************************************
  7. *
  8. *       Defines
  9. *
  10. **********************************************************************
  11. */
  12. #define SPEED 1000
  13. /*******************************************************************
  14. *
  15. *       static code
  16. *
  17. ********************************************************************
  18. */
  19. /*******************************************************************
  20. *
  21. *       _ShowSeveralFunctions
  22. */
  23. static void _ShowSeveralFunctions(DROPDOWN_Handle hDropDown) {
  24.   int NumEntries;
  25.   int i;
  26.   int Key;
  27.   int Cnt;
  28.   char ac[] = "-- sec to play with dropdown control";
  29.   Key = 0;
  30.   Cnt = 15;
  31.   //
  32.   // Set focus
  33.   //
  34.   GUI_DispStringAtCEOL("WM_SetFocus", 5, 55);
  35.   GUI_Delay(SPEED * 0.9);
  36.   WM_SetFocus(hDropDown);
  37.   GUI_Delay(SPEED * 0.7);
  38.   //
  39.   // Add strings
  40.   //
  41.   GUI_DispStringAtCEOL("DROPDOWN_AddString", 5, 55);
  42.   GUI_Delay(SPEED * 0.8);
  43.   DROPDOWN_AddString(hDropDown, "English");   (1)
  44.   DROPDOWN_AddString(hDropDown, "Deutsch");
  45.   DROPDOWN_AddString(hDropDown, "Fran鏰is");
  46.   DROPDOWN_AddString(hDropDown, "Japanese");
  47.   DROPDOWN_AddString(hDropDown, "Italiano");
  48.   DROPDOWN_AddString(hDropDown, "Espa駉l");
  49.   DROPDOWN_AddString(hDropDown, "Other language ...");
  50.   GUI_Delay(SPEED * 0.6);
  51.   //
  52.   // Increment selection
  53.   //
  54.   GUI_DispStringAtCEOL("DROPDOWN_IncSel", 5, 55);
  55.   GUI_Delay(SPEED);
  56.   NumEntries = DROPDOWN_GetNumItems(hDropDown);(2)
  57.   for (i = 0; i < (NumEntries - 2); i++) {
  58.     DROPDOWN_IncSel(hDropDown);(3)
  59.     GUI_Delay(SPEED / 6);
  60. }
  61.   GUI_Delay(SPEED / 4);
  62.   //
  63.   // Expand dropdown
  64.   //
  65.   GUI_DispStringAtCEOL("DROPDOWN_Expand", 5, 55);
  66.   GUI_Delay(SPEED);
  67.   DROPDOWN_Expand(hDropDown);(4)
  68.   GUI_Delay(SPEED * 0.75);
  69.   //
  70.   // Add scrollbar
  71.   //
  72.   GUI_DispStringAtCEOL("DROPDOWN_SetAutoScroll", 5, 55);
  73.   GUI_Delay(SPEED);
  74.   DROPDOWN_SetAutoScroll(hDropDown, 1);  (5)
  75.   GUI_Delay(SPEED * 0.75);
  76.   //
  77.   // Set font
  78.   //
  79.   GUI_DispStringAtCEOL("DROPDOWN_SetFont", 5, 55);
  80.   GUI_Delay(SPEED);
  81.   DROPDOWN_SetFont(hDropDown, &GUI_Font16B_1); (6)
  82.   GUI_Delay(SPEED * 0.75);
  83.   //
  84.   // Set text color
  85.   //
  86.   GUI_DispStringAtCEOL("DROPDOWN_SetTextColor", 5, 55);
  87.   GUI_Delay(SPEED);
  88.   DROPDOWN_SetTextColor(hDropDown, 0, 0x00BB00);(7)
  89.   DROPDOWN_SetTextColor(hDropDown, 2, GUI_BLACK);
  90.   GUI_Delay(SPEED * 0.75);
  91.   //
  92.   // Set background color
  93.   //
  94.   GUI_DispStringAtCEOL("DROPDOWN_SetBkColor", 5, 55);
  95.   GUI_Delay(SPEED);
  96.   DROPDOWN_SetBkColor(hDropDown, 0, GUI_YELLOW);  (8)
  97.   DROPDOWN_SetBkColor(hDropDown, 2, GUI_RED);
  98.   GUI_Delay(SPEED * 0.75);
  99.   //
  100.   // Delete item
  101.   //
  102.   GUI_DispStringAtCEOL("DROPDOWN_DeleteItem", 5, 55);
  103.   GUI_Delay(SPEED);
  104.   DROPDOWN_DeleteItem(hDropDown, 5);(9)
  105.   GUI_Delay(SPEED * 0.75);
  106.   //
  107.   // Collapse dropdown
  108.   //
  109.   GUI_DispStringAtCEOL("DROPDOWN_Collapse", 5, 55);
  110.   GUI_Delay(SPEED);
  111.   DROPDOWN_Collapse(hDropDown);(10)
  112.   GUI_Delay(SPEED * 0.75);
  113.   //
  114.   // Decrement selection
  115.   //
  116.   GUI_DispStringAtCEOL("DROPDOWN_DecSel", 5, 55);
  117.   GUI_Delay(SPEED);
  118.   NumEntries = DROPDOWN_GetNumItems(hDropDown);
  119.   for (i = 0; i < (NumEntries - 2); i++) {
  120.     DROPDOWN_DecSel(hDropDown);(11)
  121.     GUI_Delay(SPEED / 6);
  122. }
  123.   GUI_Delay(SPEED / 4);
  124.   //
  125.   // Let user play with dropdown control
  126.   //
  127.   GUI_DispStringAtCEOL("", 5, 55);(12)
  128.   while (!Key && (Cnt > 0)) {
  129.     ac[0] = '0' + (Cnt / 10);
  130.     ac[1] = '0' + (Cnt-- % 10);
  131.     GUI_DispStringAtCEOL(ac, 5, 40);
  132.     GUI_Delay(1000);
  133.     Key = GUI_GetKey();
  134.   }
  135.   //
  136.   // Delete dropdown widget
  137.   //
  138.   GUI_DispStringAtCEOL("DROPDOWN_Delete", 5, 55);
  139.   GUI_Delay(SPEED * 1.1);
  140.   DROPDOWN_Delete(hDropDown);(14)
  141.   GUI_Delay(SPEED * 0.75);
  142. }
  143. /*******************************************************************
  144. *
  145. *       _DemoDropDown
  146. */
  147. static void _DemoDropDown(void) {
  148.   WM_HWIN hDropDown;
  149.   //
  150.   // Display titel
  151.   //
  152.   GUI_SetBkColor(0xB00000);
  153.   GUI_SetColor(0xFFFFFF);
  154.   GUI_SetFont(&GUI_Font24_ASCII);
  155.   GUI_DispStringHCenterAt("Dropdown - Sample", 160, 5);
  156.   GUI_Delay(SPEED / 2);
  157.   //
  158.   // Create listbox
  159.   //
  160.   GUI_SetFont(&GUI_Font8x16);
  161.   GUI_SetTextAlign(GUI_TA_LEFT);
  162.   GUI_DispStringAtCEOL("using", 5, 40);
  163.   GUI_DispStringAtCEOL("DROPDOWN_CreateEx", 5, 55);
  164.   GUI_Delay(SPEED * 0.9);
  165.   hDropDown = DROPDOWN_CreateEx(100, 80, 120, 115-50, WM_HBKWIN, WM_CF_SHOW, 0, 0); (15)
  166.   GUI_Delay(SPEED * 0.75);
  167.   //
  168.   // Show serveral functions of listbox
  169.   //
  170.   _ShowSeveralFunctions(hDropDown);
  171.   //
  172.   // Clear display
  173.   //
  174.   GUI_Clear();
  175.   GUI_Delay(SPEED * 1.5);
  176. }
  177. /*******************************************************************
  178. *
  179. *       _DemoDropDownAsChild
  180. */
  181. static void _DemoDropDownAsChild(void) {
  182.   WM_HWIN hFrame;
  183.   WM_HWIN hDropDown;
  184.   //
  185.   // Display titel
  186.   //
  187.   GUI_SetBkColor(0xB00000);
  188.   GUI_SetColor(0xFFFFFF);
  189.   GUI_SetFont(&GUI_Font24_ASCII);
  190.   GUI_DispStringHCenterAt("Dropdown as child - Sample", 160, 5);
  191.   GUI_Delay(SPEED / 2);
  192.   //
  193.   // Create framewin
  194.   //
  195.   GUI_SetFont(&GUI_Font8x16);
  196.   GUI_SetTextAlign(GUI_TA_LEFT);
  197.   GUI_DispStringAtCEOL("using", 5, 40);
  198.   GUI_DispStringAtCEOL("FRAMEWIN_Create", 5, 55);
  199.   GUI_Delay(SPEED);
  200.   hFrame = FRAMEWIN_Create("DropDown", NULL, WM_CF_SHOW, 80, 80, 160, 140);(16)
  201.   FRAMEWIN_SetFont(hFrame, &GUI_Font16B_ASCII);
  202.   FRAMEWIN_SetActive(hFrame, 1);
  203.   GUI_Delay(SPEED * 0.75);
  204.   //
  205.   // Create listbox
  206.   //
  207.   GUI_DispStringAtCEOL("DROPDOWN_CreateEx", 5, 55);
  208.   GUI_Delay(SPEED);
  209.   hDropDown = DROPDOWN_CreateEx(20, 20, 120, 65, WM_GetClientWindow(hFrame), WM_CF_SHOW, 0, 0);(17)
  210.   GUI_Delay(SPEED * 0.75);
  211.   //
  212.   // Show serveral functions of listbox
  213.   //
  214.   _ShowSeveralFunctions(hDropDown);
  215.   //
  216.   // Delete framewin widget
  217.   //
  218.   GUI_DispStringAtCEOL("FRAMEWIN_Delete", 5, 55);
  219.   GUI_Delay(SPEED);
  220.   FRAMEWIN_Delete(hFrame);
  221.   GUI_Delay(SPEED * 0.75);
  222.   //
  223.   // Clear display
  224.   //
  225.   GUI_Clear();
  226.   GUI_Delay(SPEED * 1.5);
  227. }
  228. /*********************************************************************
  229. *
  230. *       Public code
  231. *
  232. **********************************************************************
  233. */
  234. /*********************************************************************
  235. *
  236. *       MainTask
  237. */
  238. void MainTask(void) {
  239.   GUI_Init();
  240.   WM_SetDesktopColor(0xB00000);
  241.   GUI_Exec();
  242.   while(1) {
  243.     _DemoDropDown();
  244.     _DemoDropDownAsChild();
  245.   }
  246. }
复制代码
1. 函数DROPDOWN_AddString用于给下拉列表添加新元素。
2. 函数DROPDOWN_GetNumItems用于返回下拉列表中元素的数目。
3. 函数DROPDOWN_IncSel用于增加选定范围。
4. 函数DROPDOWN_Expand用于打开下拉列表。
5. 函数DROPDOWN_SetAutoScroll启用在下拉列表中自动使用滚动条
6. 函数DROPDOWN_SetFont设置给定DROPDOWN控件的字体。
7. 函数DROPDOWN_SetTextColor用于设置给定DROPDOWN控件的文本颜色。
8. 函数DROPDOWN_SetBkColor用于设置背景颜色。
9. 函数DROPROWN_DeleteItem用于删除下拉列表。
10. 函数DROPDOWN_Collapse用于关闭下拉列表。
11. 函数DROPDOWN_DecSel用于减小选定操作。
12. 用于用户操作。
13. 函数DROPDOWN_Delete用于删除下拉列表。
14. 在桌面窗口上创建下拉列表。
15. 创建框架窗口。
16. 在框架窗口上面创建下拉列表。
    在桌面窗口上面创建下拉列表时的显示效果如下:
42.4.png

    在对话框上面显示下拉列表的效果如下:
42.5.png


42.3 对话框上使用下拉列表控件
    用uCGUIBulder4.0建立一个如下的界面(分辨率480*272):
42.6.png

    给下拉列表中添加的元素如下:
42.7.png

源代码如下:
  1. #include <stddef.h>
  2. #include "GUI.h"
  3. #include "DIALOG.h"
  4. #include "WM.h"
  5. #include "BUTTON.h"
  6. #include "CHECKBOX.h"
  7. #include "DROPDOWN.h"
  8. #include "EDIT.h"
  9. #include "FRAMEWIN.h"
  10. #include "LISTBOX.h"
  11. #include "MULTIEDIT.h"
  12. #include "RADIO.h"
  13. #include "SLIDER.h"
  14. #include "TEXT.h"
  15. #include "PROGBAR.h"
  16. #include "SCROLLBAR.h"
  17. #include "LISTVIEW.h"
  18. /*********************************************************************
  19. *
  20. *       Dialog resource
  21. *
  22. * This table conatins the info required to create the dialog.
  23. * It has been created by ucGUIbuilder.
  24. */
  25. static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {
  26.     { FRAMEWIN_CreateIndirect,  "armfly",            0,                       0,  0,  480,272,FRAMEWIN_CF_MOVEABLE,0},
  27.     { DROPDOWN_CreateIndirect,   NULL,               GUI_ID_DROPDOWN0,        129,103,163,80, 0,0}
  28. };
  29. /*****************************************************************
  30. **      FunctionName:void PaintDialog(WM_MESSAGE * pMsg)
  31. **      Function: to initialize the Dialog items
  32. **                                                      
  33. **      call this function in _cbCallback --> WM_PAINT
  34. *****************************************************************/
  35. void PaintDialog(WM_MESSAGE * pMsg)
  36. {
  37.     WM_HWIN hWin = pMsg->hWin;
  38. }
  39. /*****************************************************************
  40. **      FunctionName:void InitDialog(WM_MESSAGE * pMsg)
  41. **      Function: to initialize the Dialog items
  42. **                                                      
  43. **      call this function in _cbCallback --> WM_INIT_DIALOG
  44. *****************************************************************/
  45. void InitDialog(WM_MESSAGE * pMsg)
  46. {
  47.     WM_HWIN hWin = pMsg->hWin;
  48.     //
  49.     //FRAMEWIN
  50.     //
  51.     FRAMEWIN_SetFont(hWin,&GUI_Font32B_ASCII);
  52.     FRAMEWIN_AddCloseButton(hWin, FRAMEWIN_BUTTON_RIGHT, 0);
  53.     FRAMEWIN_AddMaxButton(hWin, FRAMEWIN_BUTTON_RIGHT, 1);
  54.     FRAMEWIN_AddMinButton(hWin, FRAMEWIN_BUTTON_RIGHT, 2);
  55.     FRAMEWIN_SetTitleHeight(hWin,35);
  56.     //
  57.     //GUI_ID_DROPDOWN0
  58.     //
  59.     DROPDOWN_SetBkColor(WM_GetDialogItem(hWin,GUI_ID_DROPDOWN0),0,0xffffff);
  60.     DROPDOWN_SetFont(WM_GetDialogItem(hWin,GUI_ID_DROPDOWN0),&GUI_Font24B_ASCII);
  61.     DROPDOWN_SetAutoScroll(WM_GetDialogItem(hWin,GUI_ID_DROPDOWN0),1);
  62.     DROPDOWN_AddString(WM_GetDialogItem(hWin,GUI_ID_DROPDOWN0),"Item0");
  63.     DROPDOWN_AddString(WM_GetDialogItem(hWin,GUI_ID_DROPDOWN0),"Item1");
  64.     DROPDOWN_AddString(WM_GetDialogItem(hWin,GUI_ID_DROPDOWN0),"Item2");
  65.     DROPDOWN_AddString(WM_GetDialogItem(hWin,GUI_ID_DROPDOWN0),"Item3");
  66.     DROPDOWN_AddString(WM_GetDialogItem(hWin,GUI_ID_DROPDOWN0),"Item4");
  67. }
  68. /*********************************************************************
  69. *
  70. *       Dialog callback routine
  71. */
  72. static void _cbCallback(WM_MESSAGE * pMsg)
  73. {
  74.     int NCode, Id;
  75.     WM_HWIN hWin = pMsg->hWin;
  76.     switch (pMsg->MsgId)
  77.     {
  78.         case WM_PAINT:
  79.             PaintDialog(pMsg);
  80.             break;
  81.         case WM_INIT_DIALOG:
  82.             InitDialog(pMsg);
  83.             break;
  84.         case WM_KEY:
  85.             switch (((WM_KEY_INFO*)(pMsg->Data.p))->Key)
  86.             {
  87.                 case GUI_KEY_ESCAPE:
  88.                     GUI_EndDialog(hWin, 1);
  89.                     break;
  90.                 case GUI_KEY_ENTER:
  91.                     GUI_EndDialog(hWin, 0);
  92.                     break;
  93.             }
  94.             break;
  95.         case WM_NOTIFY_PARENT:
  96.             Id = WM_GetId(pMsg->hWinSrc);
  97.             NCode = pMsg->Data.v;        
  98.             switch (Id)
  99.             {
  100.                 case GUI_ID_OK:
  101.                     if(NCode==WM_NOTIFICATION_RELEASED)
  102.                         GUI_EndDialog(hWin, 0);
  103.                     break;
  104.                 case GUI_ID_CANCEL:
  105.                     if(NCode==WM_NOTIFICATION_RELEASED)
  106.                         GUI_EndDialog(hWin, 0);
  107.                     break;
  108.             }
  109.             break;
  110.         default:
  111.             WM_DefaultProc(pMsg);
  112.     }
  113. }
  114. /*********************************************************************
  115. *
  116. *       MainTask
  117. *
  118. **********************************************************************
  119. */
  120. void MainTask(void)
  121. {
  122.     GUI_Init();
  123.     WM_SetDesktopColor(GUI_WHITE);      /* Automacally update desktop window */
  124.     WM_SetCreateFlags(WM_CF_MEMDEV);  /* Use memory devices on all windows to avoid flicker */
  125.     //PROGBAR_SetDefaultSkin(PROGBAR_SKIN_FLEX);
  126.     //FRAMEWIN_SetDefaultSkin(FRAMEWIN_SKIN_FLEX);
  127.     //PROGBAR_SetDefaultSkin(PROGBAR_SKIN_FLEX);
  128.     //BUTTON_SetDefaultSkin(BUTTON_SKIN_FLEX);
  129.     //CHECKBOX_SetDefaultSkin(CHECKBOX_SKIN_FLEX);
  130.     //DROPDOWN_SetDefaultSkin(DROPDOWN_SKIN_FLEX);
  131.     //SCROLLBAR_SetDefaultSkin(SCROLLBAR_SKIN_FLEX);
  132.     //SLIDER_SetDefaultSkin(SLIDER_SKIN_FLEX);
  133.     //HEADER_SetDefaultSkin(HEADER_SKIN_FLEX);
  134.     //RADIO_SetDefaultSkin(RADIO_SKIN_FLEX);
  135.     GUI_ExecDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), &_cbCallback, 0, 0, 0);
  136. }
复制代码
    这个代码比较的简单,实际的显示效果如下:
42.8.png

     要实现列表向上拉,需要在对话框的资源列表中做如下处理:
  1. static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {
  2.     { FRAMEWIN_CreateIndirect,  "armfly",            0,                       0,  0,  480,272,FRAMEWIN_CF_MOVEABLE,0},
  3.     { DROPDOWN_CreateIndirect,   NULL,               GUI_ID_DROPDOWN0,        129,103,163,80, DROPDOWN_CF_UP,0}
  4. };
复制代码
    将前面的0换成DROPDOWN_CF_UP即可。实际显示效果如下:
42.9.png


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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-15 16:24 , Processed in 0.282758 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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