58.2 官方WIDGET_Spinbox实例 官方的这个实例很好的演示了spinbox的使用,这个例子在模拟器中的位置:
源码如下(程序中进行了详细的注释):
- #include "GUI.h"
- #include "DIALOG.h"
-
- /*********************************************************************
- *
- * Static data
- *
- **********************************************************************
- */
- static const GUI_WIDGET_CREATE_INFO _aDialogSpinbox[] = {
- { FRAMEWIN_CreateIndirect, "Spinbox", 0, 0, 0, 260, 160, 0, 0, 0 },
- { TEXT_CreateIndirect, "Step value", GUI_ID_TEXT0, 20, 15, 100, 21, 0, 0, 0 },
- { TEXT_CreateIndirect, "Editmode "Step"", GUI_ID_TEXT1, 20, 42, 100, 21, 0, 0, 0 },
- { TEXT_CreateIndirect, "Editmode "Edit"", GUI_ID_TEXT2, 20, 75, 100, 21, 0, 0, 0 },
- { SPINBOX_CreateIndirect, NULL, GUI_ID_SPINBOX0, 130, 15, 60, 21, 0, 0, 0 },
- { SPINBOX_CreateIndirect, NULL, GUI_ID_SPINBOX1, 130, 42, 60, 21, 0, 0, 0 },
- { SPINBOX_CreateIndirect, NULL, GUI_ID_SPINBOX2, 130, 75, 60, 21, 0, 0, 0 },
- };
-
- /*********************************************************************
- *
- * _cbBk
- * 桌面窗口的回调函数
- */
- static void _cbBk(WM_MESSAGE * pMsg) {
- int xSize;
- int ySize;
-
- switch (pMsg->MsgId) {
- case WM_PAINT:
- xSize = LCD_GetXSize();
- ySize = LCD_GetYSize();
- GUI_DrawGradientV(0, 0, xSize, ySize, GUI_BLUE, GUI_BLACK);
- GUI_SetColor(GUI_WHITE);
- GUI_SetFont(&GUI_Font24_ASCII);
- GUI_SetTextMode(GUI_TM_TRANS);
- GUI_DispStringHCenterAt("WIDGET_Spinbox - Sample", xSize / 2, 5);
- break;
- default:
- WM_DefaultProc(pMsg);
- }
- }
-
- /*********************************************************************
- *
- * _cbClient
- * 对话框的回调函数
- */
- static void _cbClient(WM_MESSAGE * pMsg) {
- EDIT_Handle hEdit;
- WM_HWIN hItem;
- int Value;
- int NCode;
- int Id;
-
- switch (pMsg->MsgId) {
- case WM_INIT_DIALOG:
-
- /* 设置框架窗口标题的字体和皮肤 */
- FRAMEWIN_SetFont(pMsg->hWin, GUI_FONT_16B_ASCII);
- FRAMEWIN_SetSkin(pMsg->hWin, FRAMEWIN_SKIN_FLEX);
-
- /* 设置文本TEXT0的对齐方式 */
- hItem = WM_GetDialogItem(pMsg->hWin, GUI_ID_TEXT0);
- TEXT_SetTextAlign(hItem, GUI_TA_VCENTER | GUI_TA_RIGHT);
-
- /* 设置文本TEXT1的对齐方式 */
- hItem = WM_GetDialogItem(pMsg->hWin, GUI_ID_TEXT1);
- TEXT_SetTextAlign(hItem, GUI_TA_VCENTER | GUI_TA_RIGHT);
-
- /* 设置文本TEXT2的对齐方式 */
- hItem = WM_GetDialogItem(pMsg->hWin, GUI_ID_TEXT2);
- TEXT_SetTextAlign(hItem, GUI_TA_VCENTER | GUI_TA_RIGHT);
-
- /* 设置spinbox的皮肤 */
- hItem = WM_GetDialogItem(pMsg->hWin, GUI_ID_SPINBOX0);
- SPINBOX_SetSkin(hItem, SPINBOX_SKIN_FLEX);
- hEdit = SPINBOX_GetEditHandle(hItem);
- /* 启用编辑字段的十进制编辑模式 */
- EDIT_SetDecMode(hEdit,
- 1, /* 要修改的值 */
- 1, /* 最小值 */
- 10, /* 最大值 */
- 0, /* 如果>0,指定小数点的位置 */
- 0); /* 0(默认值):在正常模式下编辑,符号仅在Value为负值时显示 */
-
- /* 设置spinbox的皮肤 */
- hItem = WM_GetDialogItem(pMsg->hWin, GUI_ID_SPINBOX1);
- SPINBOX_SetSkin(hItem, SPINBOX_SKIN_FLEX);
- hEdit = SPINBOX_GetEditHandle(hItem);
- /* 启用编辑字段的十进制编辑模式 */
- EDIT_SetDecMode(hEdit,
- 1, /* 要修改的值 */
- 0, /* 最小值 */
- 99999, /* 最大值 */
- 0, /* 如果>0,指定小数点的位置 */
- 0); /* 0(默认值):在正常模式下编辑,符号仅在Value为负值时显示 */
-
- /* 设置spinbox的皮肤 */
- hItem = WM_GetDialogItem(pMsg->hWin, GUI_ID_SPINBOX2);
- SPINBOX_SetSkin(hItem, SPINBOX_SKIN_FLEX);
-
- /* 特别注意,这个函数是5.24版本才加入的,用于设置模式 */
- SPINBOX_SetEditMode(hItem, SPINBOX_EM_EDIT);
- /* 设置最大和最小值 */
- SPINBOX_SetRange(hItem, 0, 99999);
- break;
- case WM_NOTIFY_PARENT:
- NCode = pMsg->Data.v;
- switch (NCode) {
- /* 接收到GUI_ID_SPINBOX0的WM_NOTIFICATION_VALUE_CHANGED消息后,根据SPINBOX0
- 中的当前值修改SPINBOX1中单次的前进后退步数。
- */
- case WM_NOTIFICATION_VALUE_CHANGED:
- Id = WM_GetId(pMsg->hWinSrc);
- if (Id == GUI_ID_SPINBOX0) {
- Value = SPINBOX_GetValue(pMsg->hWinSrc);
- hItem = WM_GetDialogItem(pMsg->hWin, GUI_ID_SPINBOX1);
- SPINBOX_SetStep(hItem, Value);
- }
- break;
- default:
- WM_DefaultProc(pMsg);
- }
- break;
- case WM_PAINT:
- GUI_SetBkColor(0xAE9E8D);
- GUI_Clear();
- break;
- default:
- WM_DefaultProc(pMsg);
- }
- }
-
- /*********************************************************************
- *
- * MainTask
- */
- void MainTask(void) {
- GUI_Init();
- WM_SetCallback(WM_HBKWIN, _cbBk);
- TEXT_SetDefaultTextColor(GUI_WHITE);
- /* 创建对话框 */
- GUI_CreateDialogBox(_aDialogSpinbox, GUI_COUNTOF(_aDialogSpinbox), _cbClient, WM_HBKWIN, 30, 60);
- while (1) {
- GUI_Delay(100);
- }
- }
复制代码
实际显示效果如下:
|