描述:
简单说就是在wtl窗口机制里用非模式对话框模拟模式对话框,我的代码大概如下,实在ATL复合控件里面弹出一个非模式对话框模拟对话框等待,但有时窗口或鼠标变化后某个消息会导致整个程序失去响应,我在IE里面测试组件,请高手指点:
CDlgShowMeAsMod dlgShow;
dlgShow.m_bClosed=FALSE;
dlgShow.Create(m_hWnd);
dlgShow.ShowWindow(SW_SHOW);
::EnableWindow(m_hWnd,FALSE);
//wait until m_bClosed==TRUE
MSG msg;
while (dlgShow.m_bClosed ==FALSE)
{
::GetMessage(&msg,NULL,0,0);
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
::EnableWindow(m_hWnd,TRUE);
//do sth else
解决方案1:
http://blogs.msdn.com/oldnewthing/archive/2005/02/18/376080.aspx
解决方案2:up
解决方案3: 对消息进行一些过滤,非对话框窗口的鼠标键盘消息一律不处理(不调用Translage和Dispatch),其它消息都放行。
GetMessage(...);
if (msg.hwnd==NULL || msg.hwnd==dlgShow.m_hWnd ||
!((msg.message>=WM_KEYFIRST&&msg.message<=WM_KEYLAST) || (msg.message>=WM_MOUSEFIRST&&msg.message<=WM_MOUSELAST)))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
这样好了,开启一个线程处理你的操作,等线程结束的时候发给组件一个消息
然后组件弹出模态对话框.
或者直接将控件指针传给对话框,在对话框的创建消息中开启线程处理.