24小时热门版块排行榜    

查看: 1414  |  回复: 13

缘不可解

新虫 (初入文坛)

【答案】应助回帖

★ ★ ★ ★ ★ ★ ★
dq20081935: 金币+7, ★★★很有帮助 2012-11-26 16:27:06
引用回帖:
7楼: Originally posted by dq20081935 at 2012-11-06 22:14:26
求mfc settimer()的用法,谢谢!

CWnd::SetTimer

UINT SetTimer(UINT nIDEvent, UINT nElapse, void (CALLBACK EXPORT*lpfnTimer) (HWND, UINT, UINT, DWORD) );

返回值:
如果函数成功,则返回新定时器的标识符。应用程序可以将这个值传递给KillTimer成员函数以销毁定时器。如果成功,则返回非零值;否则返回0。

参数: nIDEvent 指定了不为零的定时器标识符。  
nElapse 指定了定时值;以毫秒为单位。  
lpfnTimer 指定了应用程序提供的TimerProc回调函数的地址,该函数被用于处理WM_TIMER消息。如果这个参数为NULL,则WM_TIMER消息被放入应用程序的消息队列并由CWnd对象来处理。


说明:
这个函数设置一个系统定时器。指定了一个定时值,每当发生超时,则系统就向设置定时器的应用程序的消息队列发送一个WM_TIMER消息,或者将消息传递给应用程序定义的TimerProc回调函数。
lpfnTimer回调函数不需要被命名为TimerProc,但是它必须按照如下方式定义:
void CALLBACK EXPORT TimerProc(
   HWND hWnd,       // 调用SetTimer的CWnd的句柄
   UINT nMsg,         // WM_TIMER
   UINT nIDEvent      // 定时器标识
   DWORD dwTime    // 系统时间
   );
定时器是有限的全局资源;因此对于应用程序来说,检查SetTimer返回的值以确定定时器是否可用是很重要的。
坚持奋斗,学会感恩,懂得珍惜
11楼2012-11-26 13:07:50
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

dq20081935

铜虫 (小有名气)

引用回帖:
11楼: Originally posted by 缘不可解 at 2012-11-26 13:07:50
CWnd::SetTimer

UINT SetTimer(UINT nIDEvent, UINT nElapse, void (CALLBACK EXPORT*lpfnTimer) (HWND, UINT, UINT, DWORD) );

返回值:
如果函数成功,则返回新定时器的标识符。应用程序可以将这个值传递 ...

谢谢,你的答复很详细,对我很有帮助!
12楼2012-11-26 16:26:44
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

dq20081935

铜虫 (小有名气)

引用回帖:
11楼: Originally posted by 缘不可解 at 2012-11-26 13:07:50
CWnd::SetTimer

UINT SetTimer(UINT nIDEvent, UINT nElapse, void (CALLBACK EXPORT*lpfnTimer) (HWND, UINT, UINT, DWORD) );

返回值:
如果函数成功,则返回新定时器的标识符。应用程序可以将这个值传递 ...

对了,顺便在问个问题,关于定时器的,比如,每五秒钟使原来不可用的按钮变得可用,再过4秒钟该按钮又变回不可用。
这 个问题应该设置两个 SetTimer,
SetTimer(1,5000,NULL);
SetTimer(2,4000,NULL);
而且计时器2,是在1号计时器结束时开始计时的,程序能如下面写吗?我试过好象不对,你有什么办法吗?谢谢!
在void CMyDlg::OnTimer(UINT nIDEvent)
{
        // TODO: Add your message handler code here and/or call default
SetTimer(1,5000,NULL);

       
        switch(nIDEvent)
        {
        case 1:{m_button.EnableWindow (true);
                   SetTimer(2,4000,NULL);}
        case 2:m_button.EnableWindow (false);
        }
       
       
        CDialog::OnTimer(nIDEvent);
}
13楼2012-11-26 16:46:04
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

缘不可解

新虫 (初入文坛)

引用回帖:
13楼: Originally posted by dq20081935 at 2012-11-26 16:46:04
对了,顺便在问个问题,关于定时器的,比如,每五秒钟使原来不可用的按钮变得可用,再过4秒钟该按钮又变回不可用。
这 个问题应该设置两个 SetTimer,
SetTimer(1,5000,NULL);
SetTimer(2,4000,NULL) ...

你可以只用一个定时器,定义一个全局变量int m_num=0;BOOL m_flag=FALSE; 然后在

void CMyDlg::OnTimer(UINT nIDEvent)
{
    m_num++;   
    if(m_num%5==0&&m_flag==FALSE)
    {
             m_button.EnableWindow (true);
             m_flag=TRUE;
             m_num=m_num-5;
   }
  if(m_num%4==0&&m_flag==TRUE)
{
         m_button.EnableWindow (false);
         m_flag=FALSE;
         m_num=m_num-4;   
}
        CDialog::OnTimer(nIDEvent);
}
还有金币拿么
坚持奋斗,学会感恩,懂得珍惜
14楼2012-11-26 18:31:24
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 dq20081935 的主题更新
信息提示
请填处理意见