做了一个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来建立线程吗?跪谢了...
在接口下有个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:如果才能使用this->settimer()并让响应WM_TIMER消息
==>1 如果实在不行的话,你可以用PostMessage()的,
::PostMessage(this->m_hWnd, WM_TIMER,0,0);
2 也可以在你的类中把SetTimer()重载一下,就应该可以了
::SetTimer(this->m_hWnd,1,dwInterval,NULL);
则m_hWnd窗体的回调过程将收到WM_TIMER消息。如果你打算通过时间事件来进行响应需要自己建立一个apc队列或一个Thread。CQYCom* wnd;
方法很多全局共享变量,共享内存,以及窗体关联。
SetWindowLong可设定一个窗体关联一个DWORD型数据。atl类内部为啥不能CreateThread。貌似ms还没说哪个地方不能CreateThread
==>GetDlgItem()获取handle然后进行访问,不知道是否符合你的要求
==>把winuser.h包含进来,这样在ATL里面随便你怎么用这些Windows API
2.定义个CQYCom的全局变量
3.可以创建线程..