硬汉嵌入式论坛

 找回密码
 立即注册
查看: 5227|回复: 0
收起左侧

[emWin教程入门篇] 【STemWin教程】第58章 SPINBOX控件

[复制链接]

740

主题

1326

回帖

3546

积分

管理员

春暖花开

Rank: 9Rank: 9Rank: 9

积分
3546
QQ
发表于 2015-3-13 11:40:07 | 显示全部楼层 |阅读模式
特别说明:完整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大家都可以试试。
努力打造安富莱高质量微信公众号:点击扫描图片关注
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-6-5 09:42 , Processed in 0.341136 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表