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

【安富莱STemWin教程】第36章 窗口管理器之定时器使用

[复制链接]
baiyongbin2009 发布时间:2015-2-15 20:25
特别说明:完整STemWin的1-60期教程和配套实例下载地址:链接
第36章 窗口管理器之定时器使用

    本期教程跟大家讲一下STemWin自带的定时器使用方法,这个定时器使用起来非常简单,而且很实用。在需要定时更新的时候可以用这个定时器。
    36. 1  定时器功能介绍
    36. 2 桌面窗口上使用定时器实例
    36. 3 对话框上使用定时器实例
    36. 4 总结
36.1 定时器功能介绍
    STemWin中有四个定时器相关的API函数供用户调用。
函数
功能描述
WM_CreateTimer()
创建向窗口发送WM_TIMER消息的定时器
WM_DeleteTimer()
删除定时器
WM_GetTimerId()
获取给定定时器的Id
WM_RestartTimer()
重启定时器
这四个函数都是简单易用,下面通过两个例子跟大家讲解一下定时器的使用。
36.2 桌面窗口上使用定时器实例
    源代码如下(可以将其直接的复制到开发板或者模拟器上面运行)
  1. #include <stddef.h>
  2. #include "GUI.h"
  3. #include "DIALOG.h"

  4. #include "WM.h"
  5. #include "BUTTON.h"
  6. #include "CHECKBOX.h"
  7. #include "DROPDOWN.h"
  8. #include "EDIT.h"
  9. #include "FRAMEWIN.h"
  10. #include "LISTBOX.h"
  11. #include "MULTIEDIT.h"
  12. #include "RADIO.h"
  13. #include "SLIDER.h"
  14. #include "TEXT.h"
  15. #include "PROGBAR.h"
  16. #include "SCROLLBAR.h"
  17. #include "LISTVIEW.h"


  18. GUI_COLOR _acColor[3] = {GUI_BLUE,GUI_RED,GUI_YELLOW};
  19. static  char ucBackColor;

  20. /*********************************************************************
  21. *
  22. *       Dialog callback routine
  23. */
  24. static void _cbBkWindow(WM_MESSAGE * pMsg)
  25. {
  26.     WM_HWIN hWin = pMsg->hWin;

  27.     switch (pMsg->MsgId)
  28.     {
  29. case WM_PAINT:
  30. ucBackColor++;
  31. if (ucBackColor == 3)
  32. {
  33. ucBackColor = 0;
  34. }
  35. GUI_SetBkColor(_acColor[ucBackColor]);
  36. GUI_Clear();
  37.             break;
  38. case WM_TIMER: (1)
  39. WM_RestartTimer(pMsg->Data.v, 1000);
  40. WM_InvalidateWindow(hWin);
  41.             break;
  42.         default:
  43.             WM_DefaultProc(pMsg);
  44.     }
  45. }

  46. /*********************************************************************
  47. *
  48. *       MainTask
  49. *
  50. **********************************************************************
  51. */
  52. void MainTask(void)
  53. {
  54. WM_HTIMER hTimer;

  55. GUI_Init();
  56.     /* 设置桌面窗口回调函数 */
  57. WM_SetCallback(WM_HBKWIN, _cbBkWindow);
  58. hTimer = WM_CreateTimer(WM_HBKWIN, 0, 1000, 0);(2)
  59. while (1)
  60. {
  61. GUI_Delay(500);
  62. }
  63. }
复制代码
这个Demo主要是实现每隔1000ms改变一下桌面窗口的颜色。
1. 定时器消息,这里要特别注意,如果想要定时器每隔一段时间执行一次,而不是只执行一次,必须得调用WM_RestartTimer()。在这个消息里面将桌面窗口无效进而会执行桌面窗口的重绘消息。
2. 创建定时器函数
     WM_CreateTimer(WM_HBKWIN, //接受信息的窗口的句柄,注意是窗口而不是对话框
                                    0,  //用户定义的Id。如果不对同一窗口使用多个定时器,此值可以设置为零。
                                    1000,  //周期,此周期过后指定窗口应收到消息。
                                     0) //保留,留作将来使用
这个Demo的实际显示效果如下:
36.1.png
36.3 对话框上使用定时器实例
    这个Demo的主要功能是在对话框上面实现一个计数功能。下面是源码(可以将其直接的复制到开发板或者模拟器上面运行)
  1. #include <stddef.h>
  2. #include "stdio.h"
  3. #include "GUI.h"
  4. #include "DIALOG.h"

  5. #include "WM.h"
  6. #include "BUTTON.h"
  7. #include "CHECKBOX.h"
  8. #include "DROPDOWN.h"
  9. #include "EDIT.h"
  10. #include "FRAMEWIN.h"
  11. #include "LISTBOX.h"
  12. #include "MULTIEDIT.h"
  13. #include "RADIO.h"
  14. #include "SLIDER.h"
  15. #include "TEXT.h"
  16. #include "PROGBAR.h"
  17. #include "SCROLLBAR.h"
  18. #include "LISTVIEW.h"

  19. static int Count;
  20. /*********************************************************************
  21. *
  22. *       Dialog resource
  23. *
  24. * This table conatins the info required to create the dialog.
  25. * It has been created by ucGUIbuilder.
  26. */

  27. static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {
  28.     { FRAMEWIN_CreateIndirect,  "armfly",            0,                       0,  0,  800,480,FRAMEWIN_CF_MOVEABLE,0},
  29.     { BUTTON_CreateIndirect,    "BUTTON0",           GUI_ID_BUTTON0,          82, 122,162,37, 0,0},
  30.     { BUTTON_CreateIndirect,    "BUTTON1",           GUI_ID_BUTTON1,          357,123,152,35, 0,0},
  31. { TEXT_CreateIndirect,      "0000",              GUI_ID_TEXT0,            278,264,300,48, 0,0}
  32. };

  33. /*****************************************************************
  34. **      FunctionName:void PaintDialog(WM_MESSAGE * pMsg)
  35. **      Function: to initialize the Dialog items
  36. **                                                      
  37. **      call this function in _cbCallback --> WM_PAINT
  38. *****************************************************************/

  39. void PaintDialog(WM_MESSAGE * pMsg)
  40. {
  41.     WM_HWIN hWin = pMsg->hWin;

  42. }

  43. /*****************************************************************
  44. **      FunctionName:void InitDialog(WM_MESSAGE * pMsg)
  45. **      Function: to initialize the Dialog items
  46. **                                                      
  47. **      call this function in _cbCallback --> WM_INIT_DIALOG
  48. *****************************************************************/

  49. void InitDialog(WM_MESSAGE * pMsg)
  50. {
  51.     WM_HWIN hWin = pMsg->hWin;
  52.     //
  53.     //FRAMEWIN
  54.     //
  55.     FRAMEWIN_SetFont(hWin,&GUI_Font24B_ASCII);
  56.     FRAMEWIN_SetTextAlign(hWin,GUI_TA_VCENTER|GUI_TA_CENTER);
  57.     FRAMEWIN_AddCloseButton(hWin, FRAMEWIN_BUTTON_RIGHT, 0);
  58.     FRAMEWIN_AddMaxButton(hWin, FRAMEWIN_BUTTON_RIGHT, 1);
  59.     FRAMEWIN_AddMinButton(hWin, FRAMEWIN_BUTTON_RIGHT, 2);
  60.     FRAMEWIN_SetTitleHeight(hWin,30);

  61. //
  62.     //GUI_ID_TEXT0
  63.     //
  64.     TEXT_SetFont(WM_GetDialogItem(hWin,GUI_ID_TEXT0),&GUI_FontD36x48);

  65. }

  66. /*********************************************************************
  67. *
  68. *       Dialog callback routine
  69. */
  70. static void _cbCallback(WM_MESSAGE * pMsg)
  71. {
  72.     int NCode, Id;
  73. char buf[10];
  74.     WM_HWIN hWin = pMsg->hWin;

  75.     switch (pMsg->MsgId)
  76.     {
  77. case WM_TIMER:(1)
  78.             Count++;
  79. sprintf(buf, "%04d", Count);
  80. TEXT_SetText(WM_GetDialogItem(hWin,GUI_ID_TEXT0), (const char *)buf);
  81. WM_RestartTimer(pMsg->Data.v, 100);
  82.             break;
  83. case WM_PAINT:
  84.             PaintDialog(pMsg);
  85.             break;
  86.         case WM_INIT_DIALOG:
  87.             InitDialog(pMsg);
  88.             break;
  89.         case WM_KEY:
  90.             switch (((WM_KEY_INFO*)(pMsg->Data.p))->Key)
  91.             {
  92.                 case GUI_KEY_ESCAPE:
  93.                     GUI_EndDialog(hWin, 1);
  94.                     break;
  95.                 case GUI_KEY_ENTER:
  96.                     GUI_EndDialog(hWin, 0);
  97.                     break;
  98.             }
  99.             break;
  100.         case WM_NOTIFY_PARENT:
  101.             Id = WM_GetId(pMsg->hWinSrc);
  102.             NCode = pMsg->Data.v;        
  103.             switch (Id)
  104.             {
  105.                 case GUI_ID_OK:
  106.                     if(NCode==WM_NOTIFICATION_RELEASED)
  107.                         GUI_EndDialog(hWin, 0);
  108.                     break;
  109.                 case GUI_ID_CANCEL:
  110.                     if(NCode==WM_NOTIFICATION_RELEASED)
  111.                         GUI_EndDialog(hWin, 0);
  112.                     break;
  113.                 case GUI_ID_BUTTON0:
  114.                     switch(NCode)
  115.                     {
  116.                         case WM_NOTIFICATION_CLICKED:
  117.                             break;
  118.                         case WM_NOTIFICATION_RELEASED:

  119.                             break;
  120.                         case WM_NOTIFICATION_MOVED_OUT:

  121.                             break;
  122.                     }
  123.                     break;
  124.                 case GUI_ID_BUTTON1:
  125.                     switch(NCode)
  126.                     {
  127.                         case WM_NOTIFICATION_CLICKED:

  128.                             break;
  129.                         case WM_NOTIFICATION_RELEASED:

  130.                             break;
  131.                         case WM_NOTIFICATION_MOVED_OUT:

  132.                             break;
  133.                     }
  134.                     break;

  135.             }
  136.             break;
  137.         default:
  138.             WM_DefaultProc(pMsg);
  139.     }
  140. }

  141. /*********************************************************************
  142. *
  143. *       MainTask
  144. *
  145. **********************************************************************
  146. */
  147. void MainTask(void)
  148. {
  149.     WM_HWIN hDlg;
  150. WM_HTIMER hTimer;
  151. Count = 0;
  152. /*
  153.    使能窗口使用内存设备,这样可以有效避免闪烁 放在GUI_Init前面就包括桌面
  154.    窗口,如果放在后面就不包括桌面窗口。
  155. */
  156. WM_SetCreateFlags(WM_CF_MEMDEV);  
  157. GUI_Init();
  158. WM_SetDesktopColor(GUI_BLUE);      /* Automacally update desktop window */
  159. PROGBAR_SetDefaultSkin(PROGBAR_SKIN_FLEX);
  160. FRAMEWIN_SetDefaultSkin(FRAMEWIN_SKIN_FLEX);
  161. PROGBAR_SetDefaultSkin(PROGBAR_SKIN_FLEX);
  162. BUTTON_SetDefaultSkin(BUTTON_SKIN_FLEX);
  163. CHECKBOX_SetDefaultSkin(CHECKBOX_SKIN_FLEX);
  164. DROPDOWN_SetDefaultSkin(DROPDOWN_SKIN_FLEX);
  165. SCROLLBAR_SetDefaultSkin(SCROLLBAR_SKIN_FLEX);
  166. SLIDER_SetDefaultSkin(SLIDER_SKIN_FLEX);
  167. HEADER_SetDefaultSkin(HEADER_SKIN_FLEX);
  168. RADIO_SetDefaultSkin(RADIO_SKIN_FLEX);
  169. ///* 创建一个对话框 */
  170.     hDlg = GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), &_cbCallback, 0, 0, 0);
  171. hTimer = WM_CreateTimer(WM_GetClientWindow(hDlg), 0, 100, 0);(2)
  172. while (1)
  173. {
  174. GUI_Delay(500);
  175. }
  176. }
复制代码
1. 定时器消息,在定时器消息中实现文件控件计数值的更新。
2. 给对话框创建一个定时器,特别注意这里需要获取对话框中窗口的句柄才可以使用。
这个例子的实际显示效果如下(分辨率800*480):
36.2.png
36.4 总结
    大家学完本期教程后,可以考虑在实际项目中使用这个功能,很实用。

收藏 评论2 发布时间:2015-2-15 20:25

举报

2个回答
feel-376797 回答时间:2015-2-16 00:14:37
谢谢分享
MouseCat 回答时间:2015-2-16 00:46:17
好资料啊,收藏一下

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

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