你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【安富莱STemWin教程】第42章 DROPDOWN-下拉列表控件

[复制链接]
baiyongbin2009 发布时间:2015-3-2 11:49
特别说明:完整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
从打开的下拉列表中选择项目,然后关闭列表

收藏 评论2 发布时间:2015-3-2 11:49

举报

2个回答
baiyongbin2009 回答时间:2015-3-2 11:50:46
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


baiyongbin2009 回答时间:2015-3-2 11:52:37
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大家都可以试试。


所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版