vc6
做篮球24秒倒计时
i的初值为24void CTestDlg::OnTimer(UINT nIDEvent)
{
if(i<=0)
{
MessageBox("OK");
}
i--;
}
void CTestDlg::OnButton1() 
{ SetTimer(1,1000,NULL);
OnTimer(1); 
}结果按下Button1后立即弹出OK的框子,应该如何修改?

解决方案 »

  1.   

    你这个是明显的错误了。你添加了时钟以后,需要在宏定义的地方添加宏ON_WM_TIMER()
    这样系统就会自动在你申请了时钟后,按照你所说的间隔,找到OnTimer函数(当然OnTimer函数也需要申明到afx_msg那一代)
    这样才可以。
    你在申请了时钟后,就不用调用OnTimer(1)。而是等系统调用。
    不然,你申请的时候就不管用了。
      

  2.   

    正确的OnButton事件,只有一句:void CTestDlg::OnButton1() 
    {
        SetTimer(1,1000,NULL);
     }
      

  3.   

    是的,OnTimer是自己会响应的,不需要调用的!
      

  4.   


    你在OnButton1() 设定SetTimer(1,1000,NULL);肯定是按住BUTTON键的时间里响应定时事件,最好不要这样响应定时吧。不太明白的你的意思,是不是按下BUTTON之后开始计时呢?你试下这样呢?
    void CTestDlg::OnTimer(UINT nIDEvent)
    {
               MessageBox("OK");
        }void CTestDlg::OnButton1() 
    {    SetTimer(1,24000,NULL);
        OnTimer(1); 
    }
      

  5.   

    我是想在按下按钮后定时成1秒钟变化一次,并且有倒计时的文本,1秒钟递减一次。24秒后弹出OK
    文本好说,就是不会用计时器。在宏定义的地方添加宏ON_WM_TIMER() ,还是不能计时,一按Button1就弹出了OK。24小时后一定追加100分!
      

  6.   

    给你写了一个,但是这是一个死循环,也就是跑到24后你点了ok,然后继续读24void CTimmDlg::OnButton1() 
    {
    // TODO: Add your control notification handler code here
    m_timer=24;
    SetTimer(0, 1000, NULL);
    }void CTimmDlg::OnTimer(UINT nIDEvent) 
    {
    // TODO: Add your message handler code here and/or call default
    --m_timer;
    if(m_timer == 0)
    {
    AfxMessageBox("OK!");
    m_timer = 24;
    }
    UpdateData(FALSE);
    CDialog::OnTimer(nIDEvent);
    }
      

  7.   

    m_timer
    是对应的显示跑秒的edit对应的变量
    需要你添加ddx语句
      

  8.   

    我用MessageBox监测了一下当前剩余时间,发现可以做到一秒钟弹一次MessageBox,但是老是显示24,为什么不递减那?
      

  9.   

    我用MessageBox监测了一下当前剩余时间,发现可以做到一秒钟弹一次MessageBox,但是老是显示24,为什么不递减那?
      

  10.   

    又给你改了下,你copy我的程序没啊void CTimmDlg::DoDataExchange(CDataExchange* pDX)
    {
    CDialog::DoDataExchange(pDX);
    //{{AFX_DATA_MAP(CTimmDlg)
    DDX_Text(pDX, IDC_EDIT1, m_timer);
    //}}AFX_DATA_MAP
    }
    BEGIN_MESSAGE_MAP(CTimmDlg, CDialog)
    //{{AFX_MSG_MAP(CTimmDlg)
    ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
    ON_WM_TIMER()
    //}}AFX_MSG_MAP
    END_MESSAGE_MAP()
    void CTimmDlg::OnButton1() 
    {
    // TODO: Add your control notification handler code here
    m_timer = 25;
    SetTimer(0, 1000, NULL);
    }void CTimmDlg::OnTimer(UINT nIDEvent) 
    {
    // TODO: Add your message handler code here and/or call default
    --m_timer;
    if(!(m_timer < 0 || m_timer > 24))
    {
    UpdateData(FALSE);
    if(m_timer == 0)
    {
    AfxMessageBox("OK!");
    KillTimer(0);
    m_timer = 24;
    UpdateData(FALSE);
    }
    }
    CDialog::OnTimer(nIDEvent);
    }
      

  11.   

    试图没有刷新
    Invalidate 在OnTimer函数末尾调用下
      

  12.   

    试图没有刷新
    Invalidate 在OnTimer函数末尾调用下
      

  13.   

    OK了。谢谢各位,特别谢谢ivan_08,得等到晚上0点结贴!
      

  14.   

    你关键是Invalidate 不是很明白,TRUE是读取控件的数值,FALSE是发送参数的数值到控件中
      

  15.   

    lz可以直接定义个回调函数在SetTimer作为最后一个参数传给他,就不用去响应WM_TIMER消息了,定时器每过一秒会自动调用此函数VOID CALLBACK MyTimerProc(
        HWND hwnd,
        UINT uMsg,
        UINT_PTR idEvent,
        DWORD dwTime
    );
    //在OnButton1里面这样用
    SetTimer(1, 1000, MyTimerProc);