加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

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

(2015-02-14 19:44:40)
标签:

定时器

ucos-iii

ucgui

emwin

dsp

分类: emWin
特别说明:完整STemWin的1-60期教程和配套实例下载地址:链接

第36章  窗口管理器之定时器使用

本期教程跟大家讲一下STemWin自带的定时器使用方法,这个定时器使用起来非常简单,而且很实用。在需要定时更新的时候可以用这个定时器。

36.  定时器功能介绍

36. 桌面窗口上使用定时器实例

36. 对话框上使用定时器实例

36. 总结

36.1  定时器功能介绍

STemWin中有四个定时器相关的API函数供用户调用。

函数

功能描述

WM_CreateTimer()

创建向窗口发送WM_TIMER消息的定时器

WM_DeleteTimer()

删除定时器

WM_GetTimerId()

获取给定定时器的Id

WM_RestartTimer()

重启定时器

这四个函数都是简单易用,下面通过两个例子跟大家讲解一下定时器的使用。

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;

 

 

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);

    }

}

 

 

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的实际显示效果如下:

【STemWin教程入门篇】第36章 <wbr>窗口管理器之定时器使用

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;

 

 

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}

};

 

 

 

void PaintDialog(WM_MESSAGE pMsg)

{

    WM_HWIN hWin pMsg->hWin;

 

}

 

 

 

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);

 

}

 

 

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, "d", 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);

    }

}

 

 

void MainTask(void) 

    WM_HWIN hDlg;

WM_HTIMER hTimer;

 

Count 0;

 

WM_SetCreateFlags(WM_CF_MEMDEV);  

GUI_Init();

WM_SetDesktopColor(GUI_BLUE);      

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)

【STemWin教程入门篇】第36章 <wbr>窗口管理器之定时器使用

36.4  总结

大家学完本期教程后,可以考虑在实际项目中使用这个功能,很实用。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有