STM32/STM8技术william hill官网
直播中

硬汉Eric2013

10年用户 1035经验值
擅长:嵌入式技术
私信 关注
[经验]

【安富莱原创】【STemWin教程】第58章 SPINBOX控件

`第58章       SPINBOX控件
    本期教程讲解STemWin支持的SPINBOX控件。
    58. 1 SPINBOX控件介绍
    58. 2 官方WIDGET_Spinbox实例
    58. 3 使用官方GUIBulder建立SPINBOX控件
    58. 3 总结
58.1   SPINBOX控件介绍
    SPINBOX控件主要用于需要快速而准确的数据调整,SPINBOX控件是由一个编辑框和两个按钮组成。默认的显示效果如下:

58.1.png
设置了皮肤色后显示效果如下:

58.2.png
58.1.1      SPINBOX支持的通知代码
    以下事件是编辑框控件作为WM_NOtiFY_PARENT消息的一部分发送给其父窗口的:

消息
描述
WM_NOTIFICATION_CLICKED
已被点击。
WM_NOTIFICATION_RELEASED
已被释放。
WM_NOTIFICATION_MOVED_OUT
已被点击,且指针已移出控件,但没有释放。
WM_NOTIFICATION_VALUE_CHANGED
SPINBOX的值 (内容)已更改。

58.1.2      SPINBOX支持的键盘反应
    同第43章中的43.1.2小节一样。

`

回帖(3)

硬汉Eric2013

2015-5-23 11:57:49
58.2   官方WIDGET_Spinbox实例
    官方的这个实例很好的演示了spinbox的使用,这个例子在模拟器中的位置:


源码如下(程序中进行了详细的注释):
  1. #include "GUI.h"
  2. #include "DIALOG.h"

  3. /*********************************************************************
  4. *
  5. *       Static data
  6. *
  7. **********************************************************************
  8. */
  9. static const GUI_WIDGET_CREATE_INFO _aDialogSpinbox[] = {
  10.   { FRAMEWIN_CreateIndirect, "Spinbox",           0,                 0,  0, 260, 160, 0, 0, 0 },
  11.   { TEXT_CreateIndirect,     "Step value",        GUI_ID_TEXT0,     20, 15, 100,  21, 0, 0, 0 },
  12.   { TEXT_CreateIndirect,     "Editmode "Step"", GUI_ID_TEXT1,     20, 42, 100,  21, 0, 0, 0 },
  13.   { TEXT_CreateIndirect,     "Editmode "Edit"", GUI_ID_TEXT2,     20, 75, 100,  21, 0, 0, 0 },
  14.   { SPINBOX_CreateIndirect,  NULL,                GUI_ID_SPINBOX0, 130, 15,  60,  21, 0, 0, 0 },
  15.   { SPINBOX_CreateIndirect,  NULL,                GUI_ID_SPINBOX1, 130, 42,  60,  21, 0, 0, 0 },
  16.   { SPINBOX_CreateIndirect,  NULL,                GUI_ID_SPINBOX2, 130, 75,  60,  21, 0, 0, 0 },
  17. };

  18. /*********************************************************************
  19. *
  20. *       _cbBk
  21. *   桌面窗口的回调函数
  22. */
  23. static void _cbBk(WM_MESSAGE * pMsg) {
  24.   int xSize;
  25.   int ySize;

  26.   switch (pMsg->MsgId) {
  27.   case WM_PAINT:
  28.     xSize = LCD_GetXSize();
  29.     ySize = LCD_GetYSize();
  30.     GUI_DrawGradientV(0, 0, xSize, ySize, GUI_BLUE, GUI_BLACK);
  31.     GUI_SetColor(GUI_WHITE);
  32.     GUI_SetFont(&GUI_Font24_ASCII);
  33.     GUI_SetTextMode(GUI_TM_TRANS);
  34.     GUI_DispStringHCenterAt("WIDGET_Spinbox - Sample", xSize / 2, 5);
  35.     break;
  36.   default:
  37.     WM_DefaultProc(pMsg);
  38.   }
  39. }

  40. /*********************************************************************
  41. *
  42. *       _cbClient
  43. *   对话框的回调函数
  44. */
  45. static void _cbClient(WM_MESSAGE * pMsg) {
  46.   EDIT_Handle hEdit;
  47.   WM_HWIN     hItem;
  48.   int         Value;
  49.   int         NCode;
  50.   int         Id;

  51.   switch (pMsg->MsgId) {
  52.   case WM_INIT_DIALOG:

  53.     /* 设置框架窗口标题的字体和皮肤 */
  54.      FRAMEWIN_SetFont(pMsg->hWin, GUI_FONT_16B_ASCII);
  55.     FRAMEWIN_SetSkin(pMsg->hWin, FRAMEWIN_SKIN_FLEX);

  56.     /* 设置文本TEXT0的对齐方式 */
  57.      hItem = WM_GetDialogItem(pMsg->hWin, GUI_ID_TEXT0);
  58.     TEXT_SetTextAlign(hItem, GUI_TA_VCENTER | GUI_TA_RIGHT);
  59.    
  60.      /* 设置文本TEXT1的对齐方式 */
  61.     hItem = WM_GetDialogItem(pMsg->hWin, GUI_ID_TEXT1);
  62.     TEXT_SetTextAlign(hItem, GUI_TA_VCENTER | GUI_TA_RIGHT);
  63.    
  64.      /* 设置文本TEXT2的对齐方式 */
  65.     hItem = WM_GetDialogItem(pMsg->hWin, GUI_ID_TEXT2);
  66.     TEXT_SetTextAlign(hItem, GUI_TA_VCENTER | GUI_TA_RIGHT);

  67.     /* 设置spinbox的皮肤 */
  68.      hItem = WM_GetDialogItem(pMsg->hWin, GUI_ID_SPINBOX0);
  69.     SPINBOX_SetSkin(hItem, SPINBOX_SKIN_FLEX);
  70.     hEdit = SPINBOX_GetEditHandle(hItem);
  71.     /* 启用编辑字段的十进制编辑模式 */
  72.      EDIT_SetDecMode(hEdit,
  73.                          1,    /* 要修改的值 */
  74.                             1,    /* 最小值 */
  75.                             10,   /* 最大值 */
  76.                             0,    /* 如果>0,指定小数点的位置 */
  77.                             0);   /* 0(默认值):在正常模式下编辑,符号仅在Value为负值时显示 */

  78.      /* 设置spinbox的皮肤 */
  79.      hItem = WM_GetDialogItem(pMsg->hWin, GUI_ID_SPINBOX1);
  80.     SPINBOX_SetSkin(hItem, SPINBOX_SKIN_FLEX);
  81.     hEdit = SPINBOX_GetEditHandle(hItem);
  82.     /* 启用编辑字段的十进制编辑模式 */
  83.      EDIT_SetDecMode(hEdit,
  84.                          1,     /* 要修改的值 */
  85.                             0,     /* 最小值 */
  86.                             99999, /* 最大值 */
  87.                             0,     /* 如果>0,指定小数点的位置 */
  88.                             0);    /* 0(默认值):在正常模式下编辑,符号仅在Value为负值时显示 */
  89.    
  90.      /* 设置spinbox的皮肤 */
  91.      hItem = WM_GetDialogItem(pMsg->hWin, GUI_ID_SPINBOX2);
  92.     SPINBOX_SetSkin(hItem, SPINBOX_SKIN_FLEX);

  93.      /* 特别注意,这个函数是5.24版本才加入的,用于设置模式 */
  94.      SPINBOX_SetEditMode(hItem, SPINBOX_EM_EDIT);
  95.      /* 设置最大和最小值 */
  96.     SPINBOX_SetRange(hItem, 0, 99999);
  97.     break;
  98.   case WM_NOTIFY_PARENT:
  99.     NCode = pMsg->Data.v;
  100.     switch (NCode) {
  101.      /* 接收到GUI_ID_SPINBOX0的WM_NOTIFICATION_VALUE_CHANGED消息后,根据SPINBOX0
  102.         中的当前值修改SPINBOX1中单次的前进后退步数。
  103.      */
  104.     case WM_NOTIFICATION_VALUE_CHANGED:
  105.       Id = WM_GetId(pMsg->hWinSrc);
  106.       if (Id == GUI_ID_SPINBOX0) {
  107.         Value = SPINBOX_GetValue(pMsg->hWinSrc);
  108.         hItem = WM_GetDialogItem(pMsg->hWin, GUI_ID_SPINBOX1);
  109.         SPINBOX_SetStep(hItem, Value);
  110.       }
  111.       break;
  112.     default:
  113.       WM_DefaultProc(pMsg);
  114.     }
  115.     break;
  116.   case WM_PAINT:
  117.     GUI_SetBkColor(0xAE9E8D);
  118.     GUI_Clear();
  119.     break;
  120.   default:
  121.     WM_DefaultProc(pMsg);
  122.   }
  123. }

  124. /*********************************************************************
  125. *
  126. *       MainTask
  127. */
  128. void MainTask(void) {
  129.   GUI_Init();
  130.   WM_SetCallback(WM_HBKWIN, _cbBk);
  131.   TEXT_SetDefaultTextColor(GUI_WHITE);
  132.   /* 创建对话框 */
  133.   GUI_CreateDialogBox(_aDialogSpinbox, GUI_COUNTOF(_aDialogSpinbox), _cbClient,  WM_HBKWIN,  30,  60);
  134.   while (1) {
  135.     GUI_Delay(100);
  136.   }
  137. }
实际显示效果如下:



举报

硬汉Eric2013

2015-5-23 11:59:19
58.3   使用官方GUIBulder建立SPINBOX控件
    这里用GUIBulder5.22建立一个如下的界面(分辨率480*272):


当前GUIBulder5.22版本对SPINBOX控件的支持还比较的弱,仅支持将其添加到对话框上面。将生成的代码直接复制到模拟器或者开发板上面运行,实际显示效果如下(生成的代码在本期教程配套的例子中):



举报

硬汉Eric2013

2015-5-23 11:59:56
58.4  总结
    本期教程主要是跟大家讲解了SPINBOX控件的基础使用方法。希望大家可以把本期教程中讲的这两个例子跑跑,然后自己设计一个相关的例子进行试验学习。教程中只是使用了部分的SPINBOX控件API,其它的API大家都可以试试。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分