完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
转stemwin教程
本期教程跟大家讲一下STemWin自带的定时器使用方法,这个定时器使用起来非常简单,而且很实用。在需要定时更新的时候可以用这个定时器。 36. 1 定时器功能介绍 36. 2 桌面窗口上使用定时器实例 36. 3 对话框上使用定时器实例 36. 4 总结 36.1 定时器功能介绍 STemWin中有四个定时器相关的API函数供用户调用。
这四个函数都是简单易用,下面通过两个例子跟大家讲解一下定时器的使用。 |
|
相关推荐
|
|
36.2 桌面窗口上使用定时器实例
源代码如下(可以将其直接的复制到开发板或者模拟器上面运行) 复制代码 #include #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 #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): |
|
|
|
|
|
215 浏览 0 评论
232 浏览 0 评论
《DNESP32S3使用指南-IDF版_V1.6》第四十一章 音乐播放器实验
355 浏览 0 评论
405 浏览 0 评论
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-初识设备树之Makefile修改
1035 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
12175 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-1-15 17:55 , Processed in 0.564050 second(s), Total 49, Slave 42 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (威廉希尔官方网站 图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号