我是如此打开窗口的:
CMainDlg dlg;
MainWin=&dlg;
dlg.DoModal(); 我点窗口上的红叉,能关闭窗口(调用了成员函数OnClose()),并且 DoModal()函数能执行结束。
但是我使用SendMessage函数发送WM_CLOSE消息:
::SendMessage(MainWin->m_hWnd,WM_CLOSE,0,0);窗口是消失了,但是好像没有调用成员函数OnClose(),DoModal()函数也没有执行结束!请问这是什么原因?
CMainDlg dlg;
MainWin=&dlg;
dlg.DoModal(); 我点窗口上的红叉,能关闭窗口(调用了成员函数OnClose()),并且 DoModal()函数能执行结束。
但是我使用SendMessage函数发送WM_CLOSE消息:
::SendMessage(MainWin->m_hWnd,WM_CLOSE,0,0);窗口是消失了,但是好像没有调用成员函数OnClose(),DoModal()函数也没有执行结束!请问这是什么原因?
{ AFX_MANAGE_STATE(AfxGetStaticModuleState());
CMainDlg dlg;
MainWin=&dlg;
dlg.DoModal();
}我需要在另一线程中关闭这个窗口,所以应该只能用发送消息的方式来关闭此窗口。
void OpenWindow()
{ AFX_MANAGE_STATE(AfxGetStaticModuleState());
CMainDlg dlg;
MainWin=&dlg;
dlg.DoModal();
}很简单的,目的就是打开一个窗口。
-----------------------------------
你这个是从哪里发出来的?应该不在CMainDlg类对象关联的对话框中吧
void myExit()
{
CDialog::OnOK();
}
也就是说你不是在CMyDialog::IDOK()中调用的,那只会让该窗口被隐藏,而并不是销毁。我前两条也在搞这个,我还是用来WinProc(),让线程给该函数发消息,然后在里面使用CDialog::IDOK(),结果发现内存有泄漏-_-!一查MSDN才明白了。直接使用EndDialog()就再也不会泄露了:)
啊,我的项目是MFC DLL,我是在theApp析构函数中向窗口发消息,但是似乎窗口已经早已没有响应了。
WM_CLOSE消息只是一个后置附加处理消息,WN_DESTROY才是销毁窗口的消息。
或者DestroyWindow方法。关闭按钮触发的是WM_SYSCOMMAND消息,消息的某参数值为SC_CLOSE。
wParam lParam为0肯定出问题的
你看看人家ms响应关闭时 这两个参数是不为0 的
如果是点窗口上的红叉,就能捕捉到。
如果是在创建对话框的线程当中,因为DoModal()会阻塞线程继续执行,所以该语句不会执行。如果在外部的线程执行,那这个变量MainWin是个什么参量呢?局部的?全局的?还是?我记得线程最好是用LPVOID类型来传递句柄或者指针的。
模态(Modal)的意义就在于“阻断(Block)”,模态对话框就是要自己关闭自己。