|
特别说明:完整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 桌面窗口上使用定时器实例
源代码如下(可以将其直接的复制到开发板或者模拟器上面运行)
- #include <stddef.h>
- #include "GUI.h"
- #include "DIALOG.h"
-
- #include "WM.h"
- #include "BUTTON.h"
- #include "CHECKBOX.h"
- #include "DROPDOWN.h"
- #include "EDIT.h"
- #include "FRAMEWIN.h"
- #include "LISTBOX.h"
- #include "MULTIEDIT.h"
- #include "RADIO.h"
- #include "SLIDER.h"
- #include "TEXT.h"
- #include "PROGBAR.h"
- #include "SCROLLBAR.h"
- #include "LISTVIEW.h"
-
-
- GUI_COLOR _acColor[3] = {GUI_BLUE,GUI_RED,GUI_YELLOW};
- static char ucBackColor;
-
- /*********************************************************************
- *
- * Dialog callback routine
- */
- static void _cbBkWindow(WM_MESSAGE * pMsg)
- {
- WM_HWIN hWin = pMsg->hWin;
-
- switch (pMsg->MsgId)
- {
- case WM_PAINT:
- ucBackColor++;
- if (ucBackColor == 3)
- {
- ucBackColor = 0;
- }
- GUI_SetBkColor(_acColor[ucBackColor]);
- GUI_Clear();
- break;
- case WM_TIMER: (1)
- WM_RestartTimer(pMsg->Data.v, 1000);
- WM_InvalidateWindow(hWin);
- break;
- default:
- WM_DefaultProc(pMsg);
- }
- }
-
- /*********************************************************************
- *
- * MainTask
- *
- **********************************************************************
- */
- void MainTask(void)
- {
- WM_HTIMER hTimer;
-
- GUI_Init();
- /* 设置桌面窗口回调函数 */
- WM_SetCallback(WM_HBKWIN, _cbBkWindow);
- hTimer = WM_CreateTimer(WM_HBKWIN, 0, 1000, 0);(2)
- while (1)
- {
- GUI_Delay(500);
- }
- }
复制代码
这个Demo主要是实现每隔1000ms改变一下桌面窗口的颜色。
1. 定时器消息,这里要特别注意,如果想要定时器每隔一段时间执行一次,而不是只执行一次,必须得调用WM_RestartTimer()。在这个消息里面将桌面窗口无效进而会执行桌面窗口的重绘消息。
2. 创建定时器函数
WM_CreateTimer(WM_HBKWIN, //接受信息的窗口的句柄,注意是窗口而不是对话框
0, //用户定义的Id。如果不对同一窗口使用多个定时器,此值可以设置为零。
1000, //周期,此周期过后指定窗口应收到消息。
0) //保留,留作将来使用
这个Demo的实际显示效果如下:
36.3 对话框上使用定时器实例
这个Demo的主要功能是在对话框上面实现一个计数功能。下面是源码(可以将其直接的复制到开发板或者模拟器上面运行)
- #include <stddef.h>
- #include "stdio.h"
- #include "GUI.h"
- #include "DIALOG.h"
-
- #include "WM.h"
- #include "BUTTON.h"
- #include "CHECKBOX.h"
- #include "DROPDOWN.h"
- #include "EDIT.h"
- #include "FRAMEWIN.h"
- #include "LISTBOX.h"
- #include "MULTIEDIT.h"
- #include "RADIO.h"
- #include "SLIDER.h"
- #include "TEXT.h"
- #include "PROGBAR.h"
- #include "SCROLLBAR.h"
- #include "LISTVIEW.h"
-
- static int Count;
- /*********************************************************************
- *
- * Dialog resource
- *
- * This table conatins the info required to create the dialog.
- * It has been created by ucGUIbuilder.
- */
-
- static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {
- { FRAMEWIN_CreateIndirect, "armfly", 0, 0, 0, 800,480,FRAMEWIN_CF_MOVEABLE,0},
- { BUTTON_CreateIndirect, "BUTTON0", GUI_ID_BUTTON0, 82, 122,162,37, 0,0},
- { BUTTON_CreateIndirect, "BUTTON1", GUI_ID_BUTTON1, 357,123,152,35, 0,0},
- { TEXT_CreateIndirect, "0000", GUI_ID_TEXT0, 278,264,300,48, 0,0}
- };
-
- /*****************************************************************
- ** FunctionName:void PaintDialog(WM_MESSAGE * pMsg)
- ** Function: to initialize the Dialog items
- **
- ** call this function in _cbCallback --> WM_PAINT
- *****************************************************************/
-
- void PaintDialog(WM_MESSAGE * pMsg)
- {
- WM_HWIN hWin = pMsg->hWin;
-
- }
-
- /*****************************************************************
- ** FunctionName:void InitDialog(WM_MESSAGE * pMsg)
- ** Function: to initialize the Dialog items
- **
- ** call this function in _cbCallback --> WM_INIT_DIALOG
- *****************************************************************/
-
- void InitDialog(WM_MESSAGE * pMsg)
- {
- WM_HWIN hWin = pMsg->hWin;
- //
- //FRAMEWIN
- //
- FRAMEWIN_SetFont(hWin,&GUI_Font24B_ASCII);
- FRAMEWIN_SetTextAlign(hWin,GUI_TA_VCENTER|GUI_TA_CENTER);
- FRAMEWIN_AddCloseButton(hWin, FRAMEWIN_BUTTON_RIGHT, 0);
- FRAMEWIN_AddMaxButton(hWin, FRAMEWIN_BUTTON_RIGHT, 1);
- FRAMEWIN_AddMinButton(hWin, FRAMEWIN_BUTTON_RIGHT, 2);
- FRAMEWIN_SetTitleHeight(hWin,30);
-
- //
- //GUI_ID_TEXT0
- //
- TEXT_SetFont(WM_GetDialogItem(hWin,GUI_ID_TEXT0),&GUI_FontD36x48);
-
- }
-
- /*********************************************************************
- *
- * Dialog callback routine
- */
- static void _cbCallback(WM_MESSAGE * pMsg)
- {
- int NCode, Id;
- char buf[10];
- WM_HWIN hWin = pMsg->hWin;
-
- switch (pMsg->MsgId)
- {
- case WM_TIMER:(1)
- Count++;
- sprintf(buf, "%04d", Count);
- TEXT_SetText(WM_GetDialogItem(hWin,GUI_ID_TEXT0), (const char *)buf);
- WM_RestartTimer(pMsg->Data.v, 100);
- break;
- case WM_PAINT:
- PaintDialog(pMsg);
- break;
- case WM_INIT_DIALOG:
- InitDialog(pMsg);
- break;
- case WM_KEY:
- switch (((WM_KEY_INFO*)(pMsg->Data.p))->Key)
- {
- case GUI_KEY_ESCAPE:
- GUI_EndDialog(hWin, 1);
- break;
- case GUI_KEY_ENTER:
- GUI_EndDialog(hWin, 0);
- break;
- }
- break;
- case WM_NOTIFY_PARENT:
- Id = WM_GetId(pMsg->hWinSrc);
- NCode = pMsg->Data.v;
- switch (Id)
- {
- case GUI_ID_OK:
- if(NCode==WM_NOTIFICATION_RELEASED)
- GUI_EndDialog(hWin, 0);
- break;
- case GUI_ID_CANCEL:
- if(NCode==WM_NOTIFICATION_RELEASED)
- GUI_EndDialog(hWin, 0);
- break;
- case GUI_ID_BUTTON0:
- switch(NCode)
- {
- case WM_NOTIFICATION_CLICKED:
- break;
- case WM_NOTIFICATION_RELEASED:
-
- break;
- case WM_NOTIFICATION_MOVED_OUT:
-
- break;
- }
- break;
- case GUI_ID_BUTTON1:
- switch(NCode)
- {
- case WM_NOTIFICATION_CLICKED:
-
- break;
- case WM_NOTIFICATION_RELEASED:
-
- break;
- case WM_NOTIFICATION_MOVED_OUT:
-
- break;
- }
- break;
-
- }
- break;
- default:
- WM_DefaultProc(pMsg);
- }
- }
-
- /*********************************************************************
- *
- * MainTask
- *
- **********************************************************************
- */
- void MainTask(void)
- {
- WM_HWIN hDlg;
- WM_HTIMER hTimer;
- Count = 0;
- /*
- 使能窗口使用内存设备,这样可以有效避免闪烁 放在GUI_Init前面就包括桌面
- 窗口,如果放在后面就不包括桌面窗口。
- */
- WM_SetCreateFlags(WM_CF_MEMDEV);
- GUI_Init();
- WM_SetDesktopColor(GUI_BLUE); /* Automacally update desktop window */
- PROGBAR_SetDefaultSkin(PROGBAR_SKIN_FLEX);
- FRAMEWIN_SetDefaultSkin(FRAMEWIN_SKIN_FLEX);
- PROGBAR_SetDefaultSkin(PROGBAR_SKIN_FLEX);
- BUTTON_SetDefaultSkin(BUTTON_SKIN_FLEX);
- CHECKBOX_SetDefaultSkin(CHECKBOX_SKIN_FLEX);
- DROPDOWN_SetDefaultSkin(DROPDOWN_SKIN_FLEX);
- SCROLLBAR_SetDefaultSkin(SCROLLBAR_SKIN_FLEX);
- SLIDER_SetDefaultSkin(SLIDER_SKIN_FLEX);
- HEADER_SetDefaultSkin(HEADER_SKIN_FLEX);
- RADIO_SetDefaultSkin(RADIO_SKIN_FLEX);
- ///* 创建一个对话框 */
- hDlg = GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), &_cbCallback, 0, 0, 0);
- hTimer = WM_CreateTimer(WM_GetClientWindow(hDlg), 0, 100, 0);(2)
- while (1)
- {
- GUI_Delay(500);
- }
- }
复制代码 1. 定时器消息,在定时器消息中实现文件控件计数值的更新。
2. 给对话框创建一个定时器,特别注意这里需要获取对话框中窗口的句柄才可以使用。
这个例子的实际显示效果如下(分辨率800*480):
36.4 总结
大家学完本期教程后,可以考虑在实际项目中使用这个功能,很实用。 |
|