39.4 对话框上使用定时器实例
这个Demo的主要功能是在对话框上面实现一个计数功能,每100ms更新一次,下面是源码(可以将其直接的复制到开发板或者模拟器上面运行)
#include "DIALOG.h"
#include "stdio.h"
/*
*********************************************************************************************************
* 变量
*********************************************************************************************************
*/
static int Count = 0;
/*
*********************************************************************************************************
* GUI_WIDGET_CREATE_INFO类型数组
*********************************************************************************************************
*/
static const GUI_WIDGET_CREATE_INFO_aDialogCreate[] = {
{FRAMEWIN_CreateIndirect, "armfly", 0, 0, 0, 320,240,0,0},
{TEXT_CreateIndirect, "0000", GUI_ID_TEXT0, 30,30,300,48,0,0}
};
/*
*********************************************************************************************************
* 函 数名: _cbCallback
* 功能说明: 对话框回调函数
* 形 参:pMsg 回调参数
* 返 回值: 无
*********************************************************************************************************
*/
static void _cbCallback(WM_MESSAGE * pMsg)
{
intNCode, Id;
charbuf[10];
WM_HWINhWin = pMsg->hWin;
switch(pMsg->MsgId)
{
caseWM_INIT_DIALOG:
//
//初始化框架窗口
//
FRAMEWIN_SetFont(hWin,&GUI_Font24B_ASCII);
FRAMEWIN_SetTextAlign(hWin,GUI_TA_VCENTER|GUI_TA_CENTER);
FRAMEWIN_SetTitleHeight(hWin,30);
//
//初始化文本控件
//
TEXT_SetFont(WM_GetDialogItem(hWin,GUI_ID_TEXT0),&GUI_FontD36x48);
break;
/* 定时器消息 */
caseWM_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;
caseWM_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;
caseWM_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;
}
break;
default:
WM_DefaultProc(pMsg);
}
}
/*
*********************************************************************************************************
* 函 数名: MainTask
* 功能说明: GUI主函数
* 形 参:无
* 返 回值: 无
*********************************************************************************************************
*/
void MainTask(void)
{
WM_HWINhDlg;
WM_HTIMERhTimer;
/* 初始emWin */
GUI_Init();
/*窗口使能使用内存设备,防止闪烁 */
WM_SetCreateFlags(WM_CF_MEMDEV);
/* 创建一个对话框 */
hDlg =GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate),&_cbCallback, 0, 0, 0);
/* 给对话框hDlg创建定时器,溢出时间是100ms */
hTimer =WM_CreateTimer(WM_GetClientWindow(hDlg), 0, 100, 0); //--------------(2)
while(1)
{
GUI_Delay(10);
}
}
1. 定时器消息,在定时器消息中实现文件控件计数值的更新,每次计数值加1。
2. 给对话框创建一个定时器,特别注意,这里需要获取对话框中客户区窗口的句柄才可以使用。
这个例子的实际显示效果如下:
