我编了个小程序 目的是实现点击“菜单1”时设置一个SetTimer()函数,点击“菜单2”时设置另一个SetTimer()函数,但应该如何在WM_TIMER 里控制当前应该调用哪个SetTimer()函数呢?在网上看到好像要用个Ontimer()函数,但这个函数好像不是sdk里的吧,所以也不知道怎么用!

解决方案 »

  1.   

    wParam或者idEvent就是用来判断是那个SetTimer设置的。
      

  2.   

    SetTimer(1,1000,NULL);//安装定时器,并将其时间间隔设为1000毫秒
    这个1就是定时器1,是用来区分不同的定时器的
    然后响应OnTimer消息函数,通过这种方式控制不同的定时器
        switch(nIDEvent)
    {
    case 1://处理定时器1
    break;
         case 2:
                      break;
    default:
    break;
    }
    最后KillTimer(1);//销毁定时器1
      

  3.   

    定时器的使用:三种方法
    如果您需要在整个程序执行期间都使用定时器,那么您将得从WinMain函数中或者在处理WM_CREATE消息时呼叫SetTimer,并在退出WinMain或响应WM_DESTROY消息时呼叫KillTimer。根据呼叫SetTimer时使用的参数,可以下列三种方法之一使用定时器。方法一
    这是最方便的一种方法,它让Windows把WM_TIMER消息发送到应用程序的正常窗口消息处理程序中,SetTimer呼叫如下所示:SetTimer (hwnd, 1, uiMsecInterval, NULL) ;
            
    第一个参数是其窗口消息处理程序将接收WM_TIMER消息的窗口句柄。第二个参数是定时器ID,它是一个非0数值,在整个例子中假定为1。第三个参数是一个32位无正负号整数,以毫秒为单位指定一个时间间隔,一个60,000的值将使Windows每分钟发送一次WM_TIMER消息。您可以通过呼叫KillTimer (hwnd, 1) ;
            
    在任何时刻停止WM_TIMER消息(即使正在处理WM_TIMER消息)。此函数的第二个参数是SetTimer呼叫中所用的同一个定时器ID。在终止程序之前,您应该响应WM_DESTROY消息停止任何活动的定时器。当您的窗口消息处理程序收到一个WM_TIMER消息时,wParam参数等于定时器的ID值(上述情形为1),lParam参数为0。如果需要设定多个定时器,那么对每个定时器都使用不同的定时器ID。wParam的值将随传递到窗口消息处理程序的WM_TIMER消息的不同而不同。为了使程序更具有可读性,您可以使用#define叙述定义不同的定时器ID:#define TIMER_SEC 1
            
    #define TIMER_MIN 2
            
    然后您可以使用两个SetTimer呼叫来设定两个定时器:SetTimer (hwnd, TIMER_SEC, 1000, NULL) ;
            
    SetTimer (hwnd, TIMER_MIN, 60000, NULL) ;
            
    WM_TIMER的处理如下所示:caseWM_TIMER:
            
        switch (wParam)
            
        {
            
        case TIMER_SEC:
            
                //每秒一次的处理
            
                      break ;
            
        case TIMER_MIN:
            
                //每分钟一次的处理
            
                break ;
            
        }
            
    return 0 ;
            
    如果您想将一个已经存在的定时器设定为不同的时间间隔,您可以简单地用不同的时间值再次呼叫SetTimer。在时钟程序里,如果显示秒或不显示秒是可以选择的,您就可以这样做,只需简单地将时间间隔在1000毫秒和60 000毫秒间切换就可以了。
      

  4.   

    OnTimer(UINT nIDEvent)
    {
    if(nIDEvent==1){}
    if(nIDEvent==2){}
    }
      

  5.   

    我直接加了两句
    if(nIDEvent==1){.....}
    if(nIDEvent==2){.....}
    编译提示我nIDEvent未申明?
      

  6.   

    要在类向导里面响应ON_WM_TIMER消息
      

  7.   

    搞定了
    直接用的wParam  但我还是不知道怎么用switch语句判断nIDEvent 因为编译器一直说没声明
    能举个例子吗?谢谢!
      

  8.   

    要在类向导里面响应ON_WM_TIMER消息,响应后自动生成的函数的参数就是nIDEvent
      

  9.   

    对啊~
    我是在写sdk
    所以你们说的那个classwizard我还不懂 呵呵...
    还有一个问题想问下
    定义一个HPEN holdpen 然后再调用MoveToEx 和LineTo函数画线
    是不是画完一次线 hnewpen就注销了呢?
    为什么我看到有的程序里画完一次线要再把holdpen的句柄再赋给hnewpen 然后再画下一次线?
      

  10.   

    为什么我看到有的程序里画完一次线要再把holdpen的句柄再赋给hnewpen 然后再画下一次线?
    -------------------------------------------------
    那是为了演示不同画笔的效果!