硬汉嵌入式论坛

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

[emWin] 跪求大佬解决两个按键控制计时器显示问题

  [复制链接]

1

主题

5

回帖

29

积分

新手上路

积分
29
发表于 2018-7-21 21:17:17 | 显示全部楼层 |阅读模式
大佬们,我用emwin写的用两个按键分别控制两个计时器,当按下一个按键的时候计时器开始显示数值,但当按下另外一个按键的时候前一个就停止了,只有当关闭后一个前一个才能继续运行,我用的GUI_Delay()这个函数来控制延时时间的,麻烦帮忙解决一下,都困扰差不多一周了,拜托了
case ID_BUTTON_13:
          switch(NCode) {
          case WM_NOTIFICATION_CLICKED:

                break;
           case WM_NOTIFICATION_RELEASED:


                                i = 0;
                                
                                        while(1){
                                                
                                                hItem =WM_GetDialogItem(pMsg->hWin, ID_PROGBAR_3);
                                                PROGBAR_SetFont(hItem, GUI_FONT_16_ASCII);
                                                PROGBAR_SetSkin(hItem,PROGBAR_SKIN_FLEX);               
                                                PROGBAR_SetMinMax(hItem,0, 1000);
                                                                        
                                                PROGBAR_SetValue(hItem,i);
                                                i++;
                                                if(i==1000)
                                                        i = 0;
                                                                        
                                                                        
                                                                        
                                                Count[3]++;
                                                hItem = WM_GetDialogItem(pMsg->hWin,ID_TEXT_31);
                                                Second[3] = (Count[3] % 60);
                                                sprintf(buf3,"%02d", Second[3]);
                                                TEXT_SetText(hItem, (const char *)buf3);
                                                
                                                hItem = WM_GetDialogItem(pMsg->hWin,ID_TEXT_32);
                                                Minute[3] = Count[3] % 3600 / 60;
                                                sprintf(buf3,"%02d", Minute[3]);
                                                TEXT_SetText(hItem, (const char *)buf3);

                                       
                                                hItem = WM_GetDialogItem(pMsg->hWin,ID_TEXT_33);
                                                Hour[3] = Count[3] % (24 * 3600) / 3600;
                                                sprintf(buf3,"%02d", Hour[3]);
                                                TEXT_SetText(hItem, (const char *)buf3);

                                                
                                                hItem = WM_GetDialogItem(pMsg->hWin,ID_TEXT_34);
                                                Day[3] = Count[3]  / (24 * 3600);
                                                sprintf(buf3,"%02d", Day[3]);
                                                TEXT_SetText(hItem, (const char *)buf3);
                                                                        
                                                GUI_Delay(1000);
                                                        
                                        }
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107042
QQ
发表于 2018-7-23 01:24:08 | 显示全部楼层
太乙真_SQsvU 发表于 2018-7-22 07:55
不是的,这个两个按键独立控制计数,比如我随便按下一个按钮它所控制的计数器开始计时不停止,按下第二个 ...

独立的就更好实现了,学习下我们新版emWin教程的定时器章节:
http://www.armbbs.cn/forum.ph ... 9834&extra=page%3D1
QQ截图20180723012322.png


回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107042
QQ
发表于 2018-7-22 00:26:55 | 显示全部楼层
简单的说,是不是这样,界面刚显示的时候,不显示计数值,按下其中一个,两个计数都开始。之后的情况是按下不同按键,来切换其中一个更新,另一个不更新。
回复

使用道具 举报

1

主题

5

回帖

29

积分

新手上路

积分
29
 楼主| 发表于 2018-7-22 07:55:37 | 显示全部楼层
eric2013 发表于 2018-7-22 00:26
简单的说,是不是这样,界面刚显示的时候,不显示计数值,按下其中一个,两个计数都开始。之后的情况是按下 ...

不是的,这个两个按键独立控制计数,比如我随便按下一个按钮它所控制的计数器开始计时不停止,按下第二个,第二个计时开始,两个是相互独立的。麻烦帮忙解决一下大佬
回复

使用道具 举报

1

主题

5

回帖

29

积分

新手上路

积分
29
 楼主| 发表于 2018-7-23 21:44:30 | 显示全部楼层
eric2013 发表于 2018-7-23 01:24
独立的就更好实现了,学习下我们新版emWin教程的定时器章节:
http://www.armbbs.cn/forum.ph ... 98 ...

叼叼叼,成功解决,谢谢
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107042
QQ
发表于 2018-7-24 01:03:23 | 显示全部楼层
太乙真_SQsvU 发表于 2018-7-23 21:44
叼叼叼,成功解决,谢谢

回复

使用道具 举报

1

主题

5

回帖

29

积分

新手上路

积分
29
 楼主| 发表于 2018-7-24 21:49:56 | 显示全部楼层

不过我创建了4个就死机了,贼尴尬
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107042
QQ
发表于 2018-7-25 00:38:22 | 显示全部楼层
太乙真_SQsvU 发表于 2018-7-24 21:49
不过我创建了4个就死机了,贼尴尬

注意同一个窗口创建创建多个定时器的使用方法。
回复

使用道具 举报

1

主题

5

回帖

29

积分

新手上路

积分
29
 楼主| 发表于 2018-7-25 12:40:18 | 显示全部楼层
eric2013 发表于 2018-7-25 00:38
注意同一个窗口创建创建多个定时器的使用方法。

文档里面好像没找到啊
回复

使用道具 举报

1

主题

5

回帖

29

积分

新手上路

积分
29
 楼主| 发表于 2018-7-25 13:31:22 | 显示全部楼层
eric2013 发表于 2018-7-25 00:38
注意同一个窗口创建创建多个定时器的使用方法。

老哥,你们这里有emwin的开发学习视频没,付费的页可以
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107042
QQ
发表于 2018-7-25 14:30:01 | 显示全部楼层
太乙真_SQsvU 发表于 2018-7-24 21:49
不过我创建了4个就死机了,贼尴尬


下面是创建两个,创建4个同理:


1、 区分ID
#define ID_TimerGraph   0
#define ID_TimerTime    1


2、给对话框创建两个定时器
hWinMain = GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), _cbDialog, WM_HBKWIN, 0, 0);

WM_CreateTimer(WM_GetClientWindow(hWinMain), /* 接受信息的窗口的句柄 */
                           ID_TimerGraph,                  /* 用户定义的Id。如果不对同一窗口使用多个定时器,此值可以设置为零。 */
                           10,                       /* 周期,此周期过后指定窗口应收到消息*/
                           0);                             /* 留待将来使用,应为0 */

WM_CreateTimer(WM_GetClientWindow(hWinMain), /* 接受信息的窗口的句柄 */
                           ID_TimerTime,                  /* 用户定义的Id。如果不对同一窗口使用多个定时器,此值可以设置为零。 */
                           10,                       /* 周期,此周期过后指定窗口应收到消息*/
                           0);                             /* 留待将来使用,应为0 */


3、回调函数,这个是重点:

case WM_TIMER:
        if(WM_GetTimerId(pMsg->Data.v) == ID_TimerGraph)
        {
                 执行需要的内容
                 /* 重启定时器 */
                WM_RestartTimer(pMsg->Data.v, 20);
        }
        else if(WM_GetTimerId(pMsg->Data.v) == ID_TimerTime)
        {
                 执行需要的内容
                 /* 重启定时器 */
                WM_RestartTimer(pMsg->Data.v, 20);

        }
        break;





回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107042
QQ
发表于 2018-7-25 14:31:05 | 显示全部楼层
太乙真_SQsvU 发表于 2018-7-25 13:31
老哥,你们这里有emwin的开发学习视频没,付费的页可以

今年没精力搞视频了,明年了吧

看新版教程学习就行,已经非常详细了
http://www.armbbs.cn/forum.php?m ... &extra=page%3D1
回复

使用道具 举报

5

主题

18

回帖

33

积分

新手上路

积分
33
发表于 2019-9-2 15:07:33 | 显示全部楼层
eric2013 发表于 2018-7-25 14:30
下面是创建两个,创建4个同理:

请问预定时间到了之后,我想把定时器显示从窗口消除该怎么写。直接Delete会报错。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107042
QQ
发表于 2019-9-3 02:01:46 | 显示全部楼层
未来通_V8B0f 发表于 2019-9-2 15:07
请问预定时间到了之后,我想把定时器显示从窗口消除该怎么写。直接Delete会报错。

不用单独删除,会随着窗口删除自动删除
回复

使用道具 举报

5

主题

18

回帖

33

积分

新手上路

积分
33
发表于 2019-9-4 10:00:58 | 显示全部楼层
eric2013 发表于 2019-9-3 02:01
不用单独删除,会随着窗口删除自动删除

如果想要不删除计时器的显示,仅在到时的时候归零。我用判断语句进行了DeleteTimer,一次计时可以实现这个效果,再想启动计时器就启动不了,请问该怎么改动
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107042
QQ
发表于 2019-9-4 10:04:02 | 显示全部楼层
未来通_V8B0f 发表于 2019-9-4 10:00
如果想要不删除计时器的显示,仅在到时的时候归零。我用判断语句进行了DeleteTimer,一次计时可以实现这个 ...

有个reset API
回复

使用道具 举报

5

主题

18

回帖

33

积分

新手上路

积分
33
发表于 2019-9-4 11:23:43 | 显示全部楼层

能具体说明一下吗,我在手册里没有找到
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107042
QQ
发表于 2019-9-4 11:50:59 | 显示全部楼层
未来通_V8B0f 发表于 2019-9-4 11:23
能具体说明一下吗,我在手册里没有找到

QQ截图20190904114845.jpg
回复

使用道具 举报

5

主题

18

回帖

33

积分

新手上路

积分
33
发表于 2019-9-4 13:55:04 | 显示全部楼层

我是这样写的,劳烦您看一下。这样写可以实现到设定时间计时器归零,但如果去掉第一个定时器里的Restart,到时间了后一个计时器不会停。
case WM_NOTIFY_PARENT:
            Id = WM_GetId(pMsg->hWinSrc);
            NCode = pMsg->Data.v;
            switch (Id)
            {
              case ID_BUTTON_0:
                switch(NCode)
                {
                    case WM_NOTIFICATION_CLICKED:
                        break;
                    case WM_NOTIFICATION_RELEASED:
                        WM_CreateTimer(hWin, /* 接受信息的窗口的句柄 */
                                        ID_TimerGraph,                  /* 用户定义的Id。如果不对同一窗口使用多个定时器,此值可以设置为零。 */
                                        10000,                       /* 周期,此周期过后指定窗口应收到消息*/
                                        0);                             /* 留待将来使用,应为0 */

                        WM_CreateTimer(hWin, /* 接受信息的窗口的句柄 */
                                        ID_TimerTime,                  /* 用户定义的Id。如果不对同一窗口使用多个定时器,此值可以设置为零。 */
                                        1000,                       /* 周期,此周期过后指定窗口应收到消息*/
                                        0);                             /* 留待将来使用,应为0 */
                        break;
                }
                break;
            }
            break;


case WM_TIMER: //--------------(1)
             if(WM_GetTimerId(pMsg->Data.v) == ID_TimerGraph)
             {
                 Count1++;
                 if(Count1<2){
                    sprintf(buf, "%02d", Count1);
                    TEXT_SetText(WM_GetDialogItem(hWin,GUI_ID_TEXT0), (const char *)buf);
                    WM_RestartTimer(pMsg->Data.v, 10000);

                 }
                 else
                 {
                     sprintf(buf, "%02d", 0);
                     TEXT_SetText(WM_GetDialogItem(hWin,GUI_ID_TEXT0), (const char *)buf);
                     WM_DeleteTimer(pMsg->Data.v);
                 }


             }

            else if(WM_GetTimerId(pMsg->Data.v) == ID_TimerTime)
            {

                Count2++;
                if(Count2<10){
                    sprintf(buf, "%02d", Count2);
                    TEXT_SetText(WM_GetDialogItem(hWin, GUI_ID_TEXT2), (const char*)buf);
                    WM_RestartTimer(pMsg->Data.v, 1000);

                }
                else if(Count1<2){
                    Count2=0;
                    sprintf(buf, "%02d", Count2);
                    TEXT_SetText(WM_GetDialogItem(hWin, GUI_ID_TEXT2), (const char*)buf);
                    WM_RestartTimer(pMsg->Data.v, 1000);

                }
                else{
                    sprintf(buf, "%02d", 0);
                     TEXT_SetText(WM_GetDialogItem(hWin,GUI_ID_TEXT2), (const char *)buf);
                     WM_DeleteTimer(pMsg->Data.v);
                }
            }
            break;
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107042
QQ
发表于 2019-9-5 07:36:57 | 显示全部楼层
未来通_V8B0f 发表于 2019-9-4 13:55
我是这样写的,劳烦您看一下。这样写可以实现到设定时间计时器归零,但如果去掉第一个定时器里的Restart ...

这个应该就是你程序逻辑的问题了,加个串口打印看看
回复

使用道具 举报

5

主题

18

回帖

33

积分

新手上路

积分
33
发表于 2019-9-5 17:51:04 | 显示全部楼层
eric2013 发表于 2019-9-5 07:36
这个应该就是你程序逻辑的问题了,加个串口打印看看

请问,多个窗口切换时,我点击按钮跳转到第二个对话框时end了第一个对话框,其中的Timer不是应该自动被删除掉了吗?为什么再回到前一个对话框,重新开始计时会在第一次计时的基础上计数?我用GUI_EndDialog和WM_DeleteWindow都试过了。窗口切换没问题,但是计时器没有删除掉。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107042
QQ
发表于 2019-9-6 08:45:16 | 显示全部楼层
未来通_V8B0f 发表于 2019-9-5 17:51
请问,多个窗口切换时,我点击按钮跳转到第二个对话框时end了第一个对话框,其中的Timer不是应该自动被删 ...

发代码看下
回复

使用道具 举报

5

主题

18

回帖

33

积分

新手上路

积分
33
发表于 2019-9-6 09:42:49 | 显示全部楼层

/******************************************************
*
*_cbDialog3
*/
static void _cbDialog3(WM_MESSAGE * pMsg)
{


    WM_HWIN hItem;

    char buf[10];
    int NCode;
    int Id;
    hItem = pMsg->hWin;

    switch (pMsg->MsgId)
    {

        case WM_INIT_DIALOG:

//
// 初始化按钮控件
//
            hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_23);
            TEXT_SetTextColor(hItem,GUI_WHITE);
            TEXT_SetFont(hItem, &GUI_Font32B_1);


            hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_24);
            TEXT_SetTextColor(hItem,GUI_WHITE);
            TEXT_SetFont(hItem, &GUI_Font32B_1);

            hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_25);
            TEXT_SetTextColor(hItem,GUI_WHITE);
            TEXT_SetFont(hItem, &GUI_Font32B_1);

            break;


     case WM_TIMER:
             if(WM_GetTimerId(pMsg->Data.v) == ID_TimerGraph)
             {
                 Count1++;
                 if(Count1<36){
                    sprintf(buf, "%02d", Count1);
                    TEXT_SetText(WM_GetDialogItem(pMsg->hWin,ID_TEXT_23), (const char *)buf);
                    WM_RestartTimer(pMsg->Data.v, 60000);

                 }
                 else
                 {
                     sprintf(buf, "%02d", 36);
                     TEXT_SetText(WM_GetDialogItem(pMsg->hWin,ID_TEXT_23), (const char *)buf);
                     WM_DeleteTimer(pMsg->Data.v);
                 }

             }
            else if(WM_GetTimerId(pMsg->Data.v) == ID_TimerTime)
            {

                Count2++;
                if(Count2<60){
                    sprintf(buf, "%02d", Count2);
                    TEXT_SetText(WM_GetDialogItem(pMsg->hWin, ID_TEXT_25), (const char*)buf);
                    WM_RestartTimer(pMsg->Data.v, 1000);

                }
                else if(Count1<36){
                    Count2=0;
                    sprintf(buf, "%02d", Count2);
                    TEXT_SetText(WM_GetDialogItem(pMsg->hWin, ID_TEXT_25), (const char*)buf);
                    WM_RestartTimer(pMsg->Data.v, 1000);

                }
                else{
                    sprintf(buf, "%02d", 0);
                     TEXT_SetText(WM_GetDialogItem(pMsg->hWin,ID_TEXT_25), (const char *)buf);
                     WM_DeleteTimer(pMsg->Data.v);
                }
            }
            break;



    case WM_NOTIFY_PARENT:
        Id = WM_GetId(pMsg->hWinSrc);
        NCode = pMsg->Data.v;
        switch(Id)
        {

            case ID_BUTTON_0:
                switch(NCode)
                {
                    case WM_NOTIFICATION_CLICKED:
                        break;
                    case WM_NOTIFICATION_RELEASED:
                      //  WM_SendMessageNoPara(hWin, WM_TIMER);

                        WM_CreateTimer(hItem, /* 接受信息的窗口的句柄 */
                           ID_TimerGraph,                  /* 用户定义的Id。如果不对同一窗口使用多个定时器,此值可以设置为零。 */
                           60000,                       /* 周期,此周期过后指定窗口应收到消息*/
                           0);                             /* 留待将来使用,应为0 */

                        WM_CreateTimer(hItem, /* 接受信息的窗口的句柄 */
                           ID_TimerTime,                  /* 用户定义的Id。如果不对同一窗口使用多个定时器,此值可以设置为零。 */
                           1000,                       /* 周期,此周期过后指定窗口应收到消息*/
                           0);

                        break;
                }
            break;

            case ID_BUTTON_1:
                switch(NCode)
                {
                    case WM_NOTIFICATION_CLICKED:
                        break;
                    case WM_NOTIFICATION_RELEASED:

                       // WM_DeleteWindow(hItem);
                        GUI_EndDialog(hItem, 0);
                        GUI_CreateDialogBox(_aDialogCreate1, GUI_COUNTOF(_aDialogCreate1), _cbDialog1, WM_HBKWIN, 0, 0);
                  //      WM_DeleteTimer(pMsg->hWin);
                        break;
                }
            break;

            }


            case WM_PAINT:
                    GUI_SetBkColor(GUI_WHITE);
                        GUI_Clear();

            GUI_DrawBitmap(pBmp[5],0,0);

            hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_0);
                        BUTTON_SetBitmapEx(hItem,BUTTON_BI_UNPRESSED,pBmp[0],0,0);

                        hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_1);
                        BUTTON_SetBitmapEx(hItem,BUTTON_BI_UNPRESSED,pBmp[1],0,0);
            break;
    default:
    WM_DefaultProc(pMsg);
    break;
    }
}
回复

使用道具 举报

5

主题

18

回帖

33

积分

新手上路

积分
33
发表于 2019-9-6 09:48:25 | 显示全部楼层

啊,解决了!抱歉抱歉!叨扰了。搞了两天,刚才贴代码仔仔细细看了一遍终于想通了。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-15 10:12 , Processed in 0.337446 second(s), 30 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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