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

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

[复制链接]
baiyongbin2009 发布时间:2015-3-14 11:34
特别说明:完整STemWin的1-60期教程和配套实例下载地址:链接
第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小节一样。
58.2 官方WIDGET_Spinbox实例
    官方的这个实例很好的演示了spinbox的使用,这个例子在模拟器中的位置:
58.3.png
源码如下(程序中进行了详细的注释):
  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. /* 设置文本TEXT1的对齐方式 */
  60.     hItem = WM_GetDialogItem(pMsg->hWin, GUI_ID_TEXT1);
  61.     TEXT_SetTextAlign(hItem, GUI_TA_VCENTER | GUI_TA_RIGHT);
  62. /* 设置文本TEXT2的对齐方式 */
  63.     hItem = WM_GetDialogItem(pMsg->hWin, GUI_ID_TEXT2);
  64.     TEXT_SetTextAlign(hItem, GUI_TA_VCENTER | GUI_TA_RIGHT);

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

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

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

  121. /*********************************************************************
  122. *
  123. *       MainTask
  124. */
  125. void MainTask(void) {
  126.   GUI_Init();
  127.   WM_SetCallback(WM_HBKWIN, _cbBk);
  128.   TEXT_SetDefaultTextColor(GUI_WHITE);
  129.   /* 创建对话框 */
  130.   GUI_CreateDialogBox(_aDialogSpinbox, GUI_COUNTOF(_aDialogSpinbox), _cbClient,  WM_HBKWIN,  30,  60);
  131.   while (1) {
  132.     GUI_Delay(100);
  133.   }
  134. }
复制代码
实际显示效果如下:
58.4.png
58.3 使用官方GUIBulder建立SPINBOX控件
    这里用GUIBulder5.22建立一个如下的界面(分辨率480*272):
58.5.png
    当前GUIBulder5.22版本对SPINBOX控件的支持还比较的弱,仅支持将其添加到对话框上面。将生成的代码直接复制到模拟器或者开发板上面运行,实际显示效果如下生成的代码在本期教程配套的例子中):
58.6.png
58.4 总结
    本期教程主要是跟大家讲解了SPINBOX控件的基础使用方法。希望大家可以把本期教程中讲的这两个例子跑跑,然后自己设计一个相关的例子进行试验学习。教程中只是使用了部分的SPINBOX控件API,其它的API大家都可以试试。

收藏 评论11 发布时间:2015-3-14 11:34

举报

11个回答
kqh1120 回答时间:2015-3-14 11:35:19
谢谢分享 14.gif
大浪10010 回答时间:2015-3-14 13:12:14
学习了,,,,
大浪10010 回答时间:2015-3-14 13:12:40
支持一下,,,
wu1169668869 回答时间:2015-3-14 13:24:17
谢谢分享~
wu1169668869 回答时间:2015-3-14 13:24:36
还有这每天都更新也是难得。。
wyxy163@126.com 回答时间:2015-3-14 13:34:46
提示: 作者被禁止或删除 内容自动屏蔽
wyxy163@126.com 回答时间:2015-3-14 13:35:07
提示: 作者被禁止或删除 内容自动屏蔽
w小菜才 回答时间:2015-3-14 14:17:28
谢谢分享
拼命三郎 回答时间:2015-3-14 17:24:59
xxxxxxxxxx.jpg
dear祝子 回答时间:2015-3-15 08:00:57
谢谢你分享你的经验
_ilikerome_ 回答时间:2015-3-15 08:53:15
谢谢分享啊  

所属标签

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