首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

OnTimer()函数有关问题

2013-10-25 
OnTimer()函数问题我在View类的OnCreate中加入一个定时器SetTimer(0,100,NULL),然后再View类的OnTimer函数

OnTimer()函数问题
我在View类的OnCreate中加入一个定时器SetTimer(0,100,NULL),然后再View类的OnTimer函数中写入如下代码:
        for(int i = 0 ; i < 50 ; ++i)
             {
                 if(this->demdata->data != NULL)
                     this->demdata->data[300][400]-=i*100;
                 if(    this->demdata->data[300][400] <0)
                     this->demdata->data[300][400]=941045;
             }
             CMainFrame *pMainFrm=(CMainFrame *)AfxGetMainWnd();
             CMDIChildWnd *pChild = pMainFrm->MDIGetActive();
             CLAIBINView *pView=(CLAIBINView*)pChild->GetActiveView();
             if(maploadok)pView->mapopen((this->demdata));
             KillTimer(0);
初始的data[300][400]=941045,表示长度为941045的直线。我现在想用一个for循环使得每循环一次让data[300][400]减去i*100,然后将每次的直线重新绘制出来。也就是让data[300][400]这条直线动态的变短。现在的问题是这条直线只是变一次而已,而不是每循环一次变一次。 
[解决办法]
去掉 KillTimer(0);

引用:
我在View类的OnCreate中加入一个定时器SetTimer(0,100,NULL),然后再View类的OnTimer函数中写入如下代码:
        for(int i = 0 ; i < 50 ; ++i)
             {
                 if(this->demdata->data != NULL)
                     this->demdata->data[300][400]-=i*100;
                 if(    this->demdata->data[300][400] <0)
                     this->demdata->data[300][400]=941045;
             }
             CMainFrame *pMainFrm=(CMainFrame *)AfxGetMainWnd();
             CMDIChildWnd *pChild = pMainFrm->MDIGetActive();
             CLAIBINView *pView=(CLAIBINView*)pChild->GetActiveView();
             if(maploadok)pView->mapopen((this->demdata));
             KillTimer(0);
初始的data[300][400]=941045,表示长度为941045的直线。我现在想用一个for循环使得每循环一次让data[300][400]减去i*100,然后将每次的直线重新绘制出来。也就是让data[300][400]这条直线动态的变短。现在的问题是这条直线只是变一次而已,而不是每循环一次变一次。 

[解决办法]
引用:
Quote: 引用:

全局变量
int ii=0;
……
              ii++;if (ii>=50) ii=0;
              {
                  if(this->demdata->data != NULL)
                      this->demdata->data[300][400]-=ii*100;//这里原来的i要改为ii
                  if(    this->demdata->data[300][400] <0)
                      this->demdata->data[300][400]=941045;
              }
              CMainFrame *pMainFrm=(CMainFrame *)AfxGetMainWnd();
              CMDIChildWnd *pChild = pMainFrm->MDIGetActive();
              CLAIBINView *pView=(CLAIBINView*)pChild->GetActiveView();


              if(maploadok)pView->mapopen((this->demdata));
              //KillTimer(0);



这个跟4楼提出的有什么区别呢

KillTime(0);被注释掉了
[解决办法]
引用:
Quote: 引用:

你没有试让其变长呢, 估计你第一个画的是最长的线, 然后又画短线, 但是以前的长线又没有擦除, 当然就看不到效果.  

你确认绘图前你擦掉原来的图了吗

按照你说的让其变长,效果也是一样只有一次变化



那就是执行得太快了.

你既然使用了timer, 那就要让timer起作用, timer多次绘制.

注意, 如果没有擦除, 仍然 让它变长.

void XXXX::OnTimer(XXXXX)
{
    static int i=0;   //注意这里附近的两句
             if(i<50)//画满50次前
             {
                 if(this->demdata->data != NULL)
                     this->demdata->data[300][400]-=i*100;
                 if(    this->demdata->data[300][400] <0)
                     this->demdata->data[300][400]=941045;
                 ++i; //这里增加i
             }
             else//画满50次后
             {
                 KillTimer(0); //这里才结果定时器.
              }

             CMainFrame *pMainFrm=(CMainFrame *)AfxGetMainWnd();
             CMDIChildWnd *pChild = pMainFrm->MDIGetActive();
             CLAIBINView *pView=(CLAIBINView*)pChild->GetActiveView();
             if(maploadok)pView->mapopen((this->demdata));
    //注意, 没有killtimer
}

热点排行