|
特别说明:完整STemWin的1-60期教程和配套实例下载地址:链接 第42章 DROPDOWN-下拉列表控件
本期教程讲解STemWin支持的下拉列表。
42. 1 下拉列表控件介绍
42. 2 官方WIDGET_Dropdown实例
42. 3 对话框上使用下拉列表控件
42. 4 总结
42.1 下拉列表控件介绍
DROPDOWN控件用于从具有若干栏的列表中选择一个元素,它以非打开状态显示当前选择的项目。如果用户打开DROPDOWN控件,就会出现一个选择新项目的LISTBOX。
设置皮肤后显示效果如下:
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。这个例子在模拟器中的位置:
源代码如下:
- #include "GUI.h"
- #include "FRAMEWIN.h"
- #include "DROPDOWN.h"
- #include "LISTBOX.h"
- #include <stddef.h>
-
- /*********************************************************************
- *
- * Defines
- *
- **********************************************************************
- */
- #define SPEED 1000
-
- /*******************************************************************
- *
- * static code
- *
- ********************************************************************
- */
- /*******************************************************************
- *
- * _ShowSeveralFunctions
- */
- static void _ShowSeveralFunctions(DROPDOWN_Handle hDropDown) {
- int NumEntries;
- int i;
- int Key;
- int Cnt;
- char ac[] = "-- sec to play with dropdown control";
-
- Key = 0;
- Cnt = 15;
- //
- // Set focus
- //
- GUI_DispStringAtCEOL("WM_SetFocus", 5, 55);
- GUI_Delay(SPEED * 0.9);
- WM_SetFocus(hDropDown);
- GUI_Delay(SPEED * 0.7);
- //
- // Add strings
- //
- GUI_DispStringAtCEOL("DROPDOWN_AddString", 5, 55);
- GUI_Delay(SPEED * 0.8);
- DROPDOWN_AddString(hDropDown, "English"); (1)
- DROPDOWN_AddString(hDropDown, "Deutsch");
- DROPDOWN_AddString(hDropDown, "Fran鏰is");
- DROPDOWN_AddString(hDropDown, "Japanese");
- DROPDOWN_AddString(hDropDown, "Italiano");
- DROPDOWN_AddString(hDropDown, "Espa駉l");
- DROPDOWN_AddString(hDropDown, "Other language ...");
- GUI_Delay(SPEED * 0.6);
- //
- // Increment selection
- //
- GUI_DispStringAtCEOL("DROPDOWN_IncSel", 5, 55);
- GUI_Delay(SPEED);
- NumEntries = DROPDOWN_GetNumItems(hDropDown);(2)
- for (i = 0; i < (NumEntries - 2); i++) {
- DROPDOWN_IncSel(hDropDown);(3)
- GUI_Delay(SPEED / 6);
- }
- GUI_Delay(SPEED / 4);
- //
- // Expand dropdown
- //
- GUI_DispStringAtCEOL("DROPDOWN_Expand", 5, 55);
- GUI_Delay(SPEED);
- DROPDOWN_Expand(hDropDown);(4)
- GUI_Delay(SPEED * 0.75);
- //
- // Add scrollbar
- //
- GUI_DispStringAtCEOL("DROPDOWN_SetAutoScroll", 5, 55);
- GUI_Delay(SPEED);
- DROPDOWN_SetAutoScroll(hDropDown, 1); (5)
- GUI_Delay(SPEED * 0.75);
- //
- // Set font
- //
- GUI_DispStringAtCEOL("DROPDOWN_SetFont", 5, 55);
- GUI_Delay(SPEED);
- DROPDOWN_SetFont(hDropDown, &GUI_Font16B_1); (6)
- GUI_Delay(SPEED * 0.75);
- //
- // Set text color
- //
- GUI_DispStringAtCEOL("DROPDOWN_SetTextColor", 5, 55);
- GUI_Delay(SPEED);
- DROPDOWN_SetTextColor(hDropDown, 0, 0x00BB00);(7)
- DROPDOWN_SetTextColor(hDropDown, 2, GUI_BLACK);
- GUI_Delay(SPEED * 0.75);
- //
- // Set background color
- //
- GUI_DispStringAtCEOL("DROPDOWN_SetBkColor", 5, 55);
- GUI_Delay(SPEED);
- DROPDOWN_SetBkColor(hDropDown, 0, GUI_YELLOW); (8)
- DROPDOWN_SetBkColor(hDropDown, 2, GUI_RED);
- GUI_Delay(SPEED * 0.75);
- //
- // Delete item
- //
- GUI_DispStringAtCEOL("DROPDOWN_DeleteItem", 5, 55);
- GUI_Delay(SPEED);
- DROPDOWN_DeleteItem(hDropDown, 5);(9)
- GUI_Delay(SPEED * 0.75);
- //
- // Collapse dropdown
- //
- GUI_DispStringAtCEOL("DROPDOWN_Collapse", 5, 55);
- GUI_Delay(SPEED);
- DROPDOWN_Collapse(hDropDown);(10)
- GUI_Delay(SPEED * 0.75);
- //
- // Decrement selection
- //
- GUI_DispStringAtCEOL("DROPDOWN_DecSel", 5, 55);
- GUI_Delay(SPEED);
- NumEntries = DROPDOWN_GetNumItems(hDropDown);
- for (i = 0; i < (NumEntries - 2); i++) {
- DROPDOWN_DecSel(hDropDown);(11)
- GUI_Delay(SPEED / 6);
- }
- GUI_Delay(SPEED / 4);
- //
- // Let user play with dropdown control
- //
- GUI_DispStringAtCEOL("", 5, 55);(12)
- while (!Key && (Cnt > 0)) {
- ac[0] = '0' + (Cnt / 10);
- ac[1] = '0' + (Cnt-- % 10);
- GUI_DispStringAtCEOL(ac, 5, 40);
- GUI_Delay(1000);
- Key = GUI_GetKey();
- }
- //
- // Delete dropdown widget
- //
- GUI_DispStringAtCEOL("DROPDOWN_Delete", 5, 55);
- GUI_Delay(SPEED * 1.1);
- DROPDOWN_Delete(hDropDown);(14)
- GUI_Delay(SPEED * 0.75);
- }
-
- /*******************************************************************
- *
- * _DemoDropDown
- */
- static void _DemoDropDown(void) {
- WM_HWIN hDropDown;
-
- //
- // Display titel
- //
- GUI_SetBkColor(0xB00000);
- GUI_SetColor(0xFFFFFF);
- GUI_SetFont(&GUI_Font24_ASCII);
- GUI_DispStringHCenterAt("Dropdown - Sample", 160, 5);
- GUI_Delay(SPEED / 2);
- //
- // Create listbox
- //
- GUI_SetFont(&GUI_Font8x16);
- GUI_SetTextAlign(GUI_TA_LEFT);
- GUI_DispStringAtCEOL("using", 5, 40);
- GUI_DispStringAtCEOL("DROPDOWN_CreateEx", 5, 55);
- GUI_Delay(SPEED * 0.9);
- hDropDown = DROPDOWN_CreateEx(100, 80, 120, 115-50, WM_HBKWIN, WM_CF_SHOW, 0, 0); (15)
- GUI_Delay(SPEED * 0.75);
- //
- // Show serveral functions of listbox
- //
- _ShowSeveralFunctions(hDropDown);
- //
- // Clear display
- //
- GUI_Clear();
- GUI_Delay(SPEED * 1.5);
- }
-
- /*******************************************************************
- *
- * _DemoDropDownAsChild
- */
- static void _DemoDropDownAsChild(void) {
- WM_HWIN hFrame;
- WM_HWIN hDropDown;
-
- //
- // Display titel
- //
- GUI_SetBkColor(0xB00000);
- GUI_SetColor(0xFFFFFF);
- GUI_SetFont(&GUI_Font24_ASCII);
- GUI_DispStringHCenterAt("Dropdown as child - Sample", 160, 5);
- GUI_Delay(SPEED / 2);
- //
- // Create framewin
- //
- GUI_SetFont(&GUI_Font8x16);
- GUI_SetTextAlign(GUI_TA_LEFT);
- GUI_DispStringAtCEOL("using", 5, 40);
- GUI_DispStringAtCEOL("FRAMEWIN_Create", 5, 55);
- GUI_Delay(SPEED);
- hFrame = FRAMEWIN_Create("DropDown", NULL, WM_CF_SHOW, 80, 80, 160, 140);(16)
- FRAMEWIN_SetFont(hFrame, &GUI_Font16B_ASCII);
- FRAMEWIN_SetActive(hFrame, 1);
- GUI_Delay(SPEED * 0.75);
- //
- // Create listbox
- //
- GUI_DispStringAtCEOL("DROPDOWN_CreateEx", 5, 55);
- GUI_Delay(SPEED);
- hDropDown = DROPDOWN_CreateEx(20, 20, 120, 65, WM_GetClientWindow(hFrame), WM_CF_SHOW, 0, 0);(17)
- GUI_Delay(SPEED * 0.75);
- //
- // Show serveral functions of listbox
- //
- _ShowSeveralFunctions(hDropDown);
- //
- // Delete framewin widget
- //
- GUI_DispStringAtCEOL("FRAMEWIN_Delete", 5, 55);
- GUI_Delay(SPEED);
- FRAMEWIN_Delete(hFrame);
- GUI_Delay(SPEED * 0.75);
- //
- // Clear display
- //
- GUI_Clear();
- GUI_Delay(SPEED * 1.5);
- }
-
- /*********************************************************************
- *
- * Public code
- *
- **********************************************************************
- */
- /*********************************************************************
- *
- * MainTask
- */
- void MainTask(void) {
- GUI_Init();
- WM_SetDesktopColor(0xB00000);
- GUI_Exec();
- while(1) {
- _DemoDropDown();
- _DemoDropDownAsChild();
- }
- }
复制代码 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.3 对话框上使用下拉列表控件
用uCGUIBulder4.0建立一个如下的界面(分辨率480*272):
给下拉列表中添加的元素如下:
源代码如下:
- #include <stddef.h>
- #include "GUI.h"
- #include "DIALOG.h"
- #include "WM.h"
- #include "BUTTON.h"
- #include "CHECKBOX.h"
- #include "DROPDOWN.h"
- #include "EDIT.h"
- #include "FRAMEWIN.h"
- #include "LISTBOX.h"
- #include "MULTIEDIT.h"
- #include "RADIO.h"
- #include "SLIDER.h"
- #include "TEXT.h"
- #include "PROGBAR.h"
- #include "SCROLLBAR.h"
- #include "LISTVIEW.h"
-
- /*********************************************************************
- *
- * Dialog resource
- *
- * This table conatins the info required to create the dialog.
- * It has been created by ucGUIbuilder.
- */
-
- static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {
- { FRAMEWIN_CreateIndirect, "armfly", 0, 0, 0, 480,272,FRAMEWIN_CF_MOVEABLE,0},
- { DROPDOWN_CreateIndirect, NULL, GUI_ID_DROPDOWN0, 129,103,163,80, 0,0}
- };
-
- /*****************************************************************
- ** FunctionName:void PaintDialog(WM_MESSAGE * pMsg)
- ** Function: to initialize the Dialog items
- **
- ** call this function in _cbCallback --> WM_PAINT
- *****************************************************************/
-
- void PaintDialog(WM_MESSAGE * pMsg)
- {
- WM_HWIN hWin = pMsg->hWin;
-
- }
-
- /*****************************************************************
- ** FunctionName:void InitDialog(WM_MESSAGE * pMsg)
- ** Function: to initialize the Dialog items
- **
- ** call this function in _cbCallback --> WM_INIT_DIALOG
- *****************************************************************/
-
- void InitDialog(WM_MESSAGE * pMsg)
- {
- WM_HWIN hWin = pMsg->hWin;
- //
- //FRAMEWIN
- //
- FRAMEWIN_SetFont(hWin,&GUI_Font32B_ASCII);
- FRAMEWIN_AddCloseButton(hWin, FRAMEWIN_BUTTON_RIGHT, 0);
- FRAMEWIN_AddMaxButton(hWin, FRAMEWIN_BUTTON_RIGHT, 1);
- FRAMEWIN_AddMinButton(hWin, FRAMEWIN_BUTTON_RIGHT, 2);
- FRAMEWIN_SetTitleHeight(hWin,35);
- //
- //GUI_ID_DROPDOWN0
- //
- DROPDOWN_SetBkColor(WM_GetDialogItem(hWin,GUI_ID_DROPDOWN0),0,0xffffff);
- DROPDOWN_SetFont(WM_GetDialogItem(hWin,GUI_ID_DROPDOWN0),&GUI_Font24B_ASCII);
- DROPDOWN_SetAutoScroll(WM_GetDialogItem(hWin,GUI_ID_DROPDOWN0),1);
- DROPDOWN_AddString(WM_GetDialogItem(hWin,GUI_ID_DROPDOWN0),"Item0");
- DROPDOWN_AddString(WM_GetDialogItem(hWin,GUI_ID_DROPDOWN0),"Item1");
- DROPDOWN_AddString(WM_GetDialogItem(hWin,GUI_ID_DROPDOWN0),"Item2");
- DROPDOWN_AddString(WM_GetDialogItem(hWin,GUI_ID_DROPDOWN0),"Item3");
- DROPDOWN_AddString(WM_GetDialogItem(hWin,GUI_ID_DROPDOWN0),"Item4");
-
- }
-
- /*********************************************************************
- *
- * Dialog callback routine
- */
- static void _cbCallback(WM_MESSAGE * pMsg)
- {
- int NCode, Id;
- WM_HWIN hWin = pMsg->hWin;
- switch (pMsg->MsgId)
- {
- case WM_PAINT:
- PaintDialog(pMsg);
- break;
- case WM_INIT_DIALOG:
- InitDialog(pMsg);
- break;
- case WM_KEY:
- switch (((WM_KEY_INFO*)(pMsg->Data.p))->Key)
- {
- case GUI_KEY_ESCAPE:
- GUI_EndDialog(hWin, 1);
- break;
- case GUI_KEY_ENTER:
- GUI_EndDialog(hWin, 0);
- break;
- }
- break;
- case WM_NOTIFY_PARENT:
- Id = WM_GetId(pMsg->hWinSrc);
- NCode = pMsg->Data.v;
- switch (Id)
- {
- case GUI_ID_OK:
- if(NCode==WM_NOTIFICATION_RELEASED)
- GUI_EndDialog(hWin, 0);
- break;
- case GUI_ID_CANCEL:
- if(NCode==WM_NOTIFICATION_RELEASED)
- GUI_EndDialog(hWin, 0);
- break;
-
- }
- break;
- default:
- WM_DefaultProc(pMsg);
- }
- }
-
- /*********************************************************************
- *
- * MainTask
- *
- **********************************************************************
- */
- void MainTask(void)
- {
- GUI_Init();
- WM_SetDesktopColor(GUI_WHITE); /* Automacally update desktop window */
- WM_SetCreateFlags(WM_CF_MEMDEV); /* Use memory devices on all windows to avoid flicker */
- //PROGBAR_SetDefaultSkin(PROGBAR_SKIN_FLEX);
- //FRAMEWIN_SetDefaultSkin(FRAMEWIN_SKIN_FLEX);
- //PROGBAR_SetDefaultSkin(PROGBAR_SKIN_FLEX);
- //BUTTON_SetDefaultSkin(BUTTON_SKIN_FLEX);
- //CHECKBOX_SetDefaultSkin(CHECKBOX_SKIN_FLEX);
- //DROPDOWN_SetDefaultSkin(DROPDOWN_SKIN_FLEX);
- //SCROLLBAR_SetDefaultSkin(SCROLLBAR_SKIN_FLEX);
- //SLIDER_SetDefaultSkin(SLIDER_SKIN_FLEX);
- //HEADER_SetDefaultSkin(HEADER_SKIN_FLEX);
- //RADIO_SetDefaultSkin(RADIO_SKIN_FLEX);
- GUI_ExecDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), &_cbCallback, 0, 0, 0);
- }
复制代码 这个代码比较的简单,实际的显示效果如下:
要实现列表向上拉,需要在对话框的资源列表中做如下处理:
- static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {
- { FRAMEWIN_CreateIndirect, "armfly", 0, 0, 0, 480,272,FRAMEWIN_CF_MOVEABLE,0},
- { DROPDOWN_CreateIndirect, NULL, GUI_ID_DROPDOWN0, 129,103,163,80, DROPDOWN_CF_UP,0}
- };
复制代码 将前面的0换成DROPDOWN_CF_UP即可。实际显示效果如下:
42.4 总结
本期教程主要是跟大家讲解了下拉列表控件的使用,希望大家可以把本期教程中讲的这两个例子跑跑,然后自己设计一个相关的例子进行试验学习。教程中只是使用了部分的下拉列表API,其它的API大家都可以试试。 |
|