做了一个ATL标准控件。
在接口下有个Start()方法。 内部想 用SetTimer设置一个时钟后到时间就调用事件。传递给客户端。
但是出现问题。已经在构造函数中 设置 m_bWindowOnly   =   TRUE; 控件是运行时不可见的。
使用this->SetTimer(1,dwInterval,NULL);的时候提示h_wnd为空
但是使用api函数::SetTimer(this->m_hWnd,1,dwInterval,(TIMERPROC)TimerProc);就没有问题。
但是如果使用API的话 CQYCom内部的成员变量就访问不了了。STDMETHODIMP CQYCom::Start(void){

//this->SetTimer(1,dwInterval,NULL); //这里提示不行。转到定义
                                              //UINT_PTR SetTimer(UINT_PTR nIDEvent, UINT nElapse, void (CALLBACK* lpfnTimer)(HWND, UINT,                  UINT_PTR, DWORD) = NULL) throw()
                                     //{
                              // ATLASSERT(::IsWindow(m_hWnd));这里m_hWnd是空的。
                             //return ::SetTimer(m_hWnd, nIDEvent, nElapse, (TIMERPROC)lpfnTimer);
                                      //}
::SetTimer(this->m_hWnd,1,dwInterval,(TIMERPROC)TimerProc);//这里可以,但是不用访问CQYCom内部成员变量
str=(_T("120.10,35.10"));
Fire_OnRecve(str);
this->SetTimer(1,dwInterval,NULL);

return S_OK;
}
void CALLBACK TimerProc(
  HWND hwnd, 
  UINT uMsg, 
  UINT idEvent, 
  DWORD dwTime 
)
{
str=(_T("120.10,35.10"));
Fire_OnRecve(str);
}LRESULT CQYCom::OnTimer(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
str=(_T("120.10,35.10"));
Fire_OnRecve(str);
return 0;
}问题1:如果才能使用this->settimer()并让响应WM_TIMER消息
问题2:怎样才能在全局函数中取到CQYCom* wnd;这样的地址,这样就能访问成员变量了。
问题3:在atl类内部可以直接使用Createthread来建立线程吗?跪谢了...

解决方案 »

  1.   


    问题1:如果才能使用this->settimer()并让响应WM_TIMER消息 
    ==>1 如果实在不行的话,你可以用PostMessage()的,
       ::PostMessage(this->m_hWnd, WM_TIMER,0,0);
       2 也可以在你的类中把SetTimer()重载一下,就应该可以了
      

  2.   

    首先需要看看msdn对SetTimer的描述说的很清楚了
    ::SetTimer(this->m_hWnd,1,dwInterval,NULL);
    则m_hWnd窗体的回调过程将收到WM_TIMER消息。如果你打算通过时间事件来进行响应需要自己建立一个apc队列或一个Thread。CQYCom* wnd;
    方法很多全局共享变量,共享内存,以及窗体关联。
    SetWindowLong可设定一个窗体关联一个DWORD型数据。atl类内部为啥不能CreateThread。貌似ms还没说哪个地方不能CreateThread
      

  3.   

    问题2:怎样才能在全局函数中取到CQYCom* wnd;这样的地址,这样就能访问成员变量了。 
    ==>GetDlgItem()获取handle然后进行访问,不知道是否符合你的要求
      

  4.   

    问题3:在atl类内部可以直接使用Createthread来建立线程吗? 
    ==>把winuser.h包含进来,这样在ATL里面随便你怎么用这些Windows API
      

  5.   

    1.自身不是窗口等,所以要使用全局的::SetTimer
    2.定义个CQYCom的全局变量
    3.可以创建线程..