硬汉嵌入式论坛

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

[emWin教程入门篇] 【STemWin教程】第36章 窗口管理器之定时器使用

[复制链接]

740

主题

1326

回帖

3546

积分

管理员

春暖花开

Rank: 9Rank: 9Rank: 9

积分
3546
QQ
发表于 2015-2-14 19:36:51 | 显示全部楼层 |阅读模式
特别说明:完整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 总结
    大家学完本期教程后,可以考虑在实际项目中使用这个功能,很实用。
努力打造安富莱高质量微信公众号:点击扫描图片关注
回复

使用道具 举报

0

主题

4

回帖

4

积分

新手上路

积分
4
发表于 2016-11-23 14:21:15 | 显示全部楼层
[s:152]
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-14 15:48 , Processed in 0.230588 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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