sdk编程,有没有可能用对象来管理SetTimer?比如说我想让一个窗口自己来移动。
class AAA
{
void MoveTo(int, int);
static VOID CALLBACK TimerProc(HWND hCtrl, UINT message,
                        UINT iTimerID, DWORD dwTime);
};
void AAA::MoveTo(int x, int y)
{
  ??? SetTimer(wnd.hCtrl, 5, 200, this->TimerProc); ???
}
这个Timerproc里面必须是静态的东西,所以让对象操作好像不适合?若你让子窗口自己移动,除了WM_TIMER,还有什么办法?

解决方案 »

  1.   

    通常的方法就是,SetTimer的最后参数给NULL,窗口响应WM_TIMER消息来处理。如果不想在窗口中响应消息,也可以在消息循环中判断处理。
      

  2.   

    不好意思,我没问清楚,我是问:
    怎样在这个对象里面处理WM_TIMER?这样不就完全封装了嘛。
    查到要给this指针个什么东西,可是这就必须在这个静态TimerProc里面处理,可是里面必须是静态变量,所以怎么和对象联系呢?
      

  3.   

    TimerProc的第1参数不就是窗口句柄吗,有句柄就可以控制窗口了。
      

  4.   

    确实如此,原因是要实现动画,我想移动到那儿还要和这个对象保存的路径有关。
    那就只能把ID值变成对象数组的index,也是十分麻烦。
    如果不这样,TimerProc有没有其他参数可传,也是郁闷。多谢了。
      

  5.   

    用SetWindowLong/SetWindowLongPtr设置DWL_USER/DWLP_USER保存与窗口有关的数据,数据不只一个时可以定义成一个结构,用new分配,将指针保存。
      

  6.   

    class AAA : public CWnd  //要在自己定义的类里面使用WM_TIMER事件 自己定义的类必须是窗口类

        void MoveTo(int, int); 
        static VOID CALLBACK TimerProc(HWND hCtrl, UINT message, 
                            UINT iTimerID, DWORD dwTime);
    protected: //{{AFX_MSG(AAA)
    afx_msg void OnTimer(UINT nIDEvent);
    //}}AFX_MSG
    DECLARE_MESSAGE_MAP() 
    }; 
    void AAA::MoveTo(int x, int y) 

        SetTimer( 5, 200, this->TimerProc ); //如果窗口继承子CWnd 就可以直接使用SetTimer来打开自己类的定时了} 
    BEGIN_MESSAGE_MAP(AAA, CWnd)
    ON_WM_TIMER()
    END_MESSAGE_MAP()void AAA::OnTimer(UINT nIDEvent) 
    {
        //在这里写AAA窗口移动的代码
    }大体上就是这个样子了 
      

  7.   

    呵呵,多谢仁兄。
    可惜我不会MFC编程,只是用SDK来玩玩。
    MFC是C++写的,所以响应SetTimer应该没有太大问题。这个自己定义的窗口类CWnd不知是什么原理,如果用SDK来写个类,不知怎么写成窗口类。
    这个this->TimerProc虽然编译没有报错,但毕竟TimerProc是静态成员函数,可否成立?
    而且在函数里面写代码,都还得是静态变量,如我上面所说,还是没有解决问题。如果太麻烦,还不如在主窗口响应WM_TIMER消息。
      

  8.   

    .Net框架里面的Windows Form timer是每个timer单独创建一个窗口处理消息,浪费啊
      

  9.   

    sdk 什么意思 
    SetTimer(hWnd,1,1000,NULL); 
    然后 case WS_TIMER: