我如何关闭主窗口???
譬如,一个简单的对话框,点击系统"关于"菜单,会
CAboutDlg dlgAbout;
dlgAbout.DoModal();
此时dlgAbout是模态的,也就是说主窗口被禁止了接受任何键盘和鼠标输入,
但是我想关闭主窗口,而不是等dlgAbout的DoModal返回!!!!请问该如何作?
我已经试过了,给主窗口发WM_CLOSE消息,此时主窗口确实不见了,但是那个关于对话框还在!
BOOL CAboutDlg::OnInitDialog()
{
CDialog::OnInitDialog();
SetTimer(1,5000,NULL);
return TRUE; }void CAboutDlg::OnTimer(UINT nIDEvent)
{
::SendMessage(GetParent()->m_hWnd,WM_CLOSE,0,0);
CDialog::OnTimer(nIDEvent);
}
譬如,一个简单的对话框,点击系统"关于"菜单,会
CAboutDlg dlgAbout;
dlgAbout.DoModal();
此时dlgAbout是模态的,也就是说主窗口被禁止了接受任何键盘和鼠标输入,
但是我想关闭主窗口,而不是等dlgAbout的DoModal返回!!!!请问该如何作?
我已经试过了,给主窗口发WM_CLOSE消息,此时主窗口确实不见了,但是那个关于对话框还在!
BOOL CAboutDlg::OnInitDialog()
{
CDialog::OnInitDialog();
SetTimer(1,5000,NULL);
return TRUE; }void CAboutDlg::OnTimer(UINT nIDEvent)
{
::SendMessage(GetParent()->m_hWnd,WM_CLOSE,0,0);
CDialog::OnTimer(nIDEvent);
}
PostQuitMessage(0);
dlgAbout.DoModal();
改为:
CAboutDlg *dlgAbout=new CAboutDlg;
CAboutDlg->Create(IDD_ABOUTBOX);
CAboutDlg->ShowWindow(SW_SHOW);不过我不明白你的意思,
你是指打开这个对话框后把主窗口关闭?
如果主窗口关闭了,
这个对话框也会相应的关闭了.
然后在这个窗口里面我creat了好多非模态的对话框,
现在然后那些非模态的对话框又各自DoModal了各自的模态对话框,
现在我的问题是:我想关闭整个程序,就像QQ一样的点击托盘图标,向主窗口(就是最开始DoModal)的那个窗口发一个命令,把屏幕上所有属于整个进程的对话框(不管非模态还是模态的,只要存在的)全部统统关闭!!
可是我现在如果向主窗口发WM_CLOSE消息的话,主窗口消失,其余的被creat的窗口也消失,但是未读有DoMOdal的creat的窗口还存在!!!主窗口 ----A
A窗口Creat了A1,A2,A3三个子窗口,
A1窗口Domodal了一个窗口,A2和A3没有
现在我如何才能用一个命令让A系列全部关闭???
【注意】不要告诉我必须把DoModal的窗口手动关闭再关闭别的哦~~~~~呵呵
我就是需要知道如何【从外部】关闭一个DoModal出来的对话框.
2.CAboutDlg关闭时发送消息给主对话框,通知主对话框CAboutDlg对话框已关闭,参数传送标志为假。
{
CWnd *pWnd = GetWindow(GW_CHILD);
while(pWnd)
{
CWnd *pWndTemp = pWnd;
pWndTemp->SendMessage(WM_CLOSE);
pWnd = pWnd->GetWindow(GW_HWNDNEXT);
}
CDialog::OnClose();
}
我难道要维护每一个new 或者构造的对话框???
换一种想法,我遍历所有本进程的窗口该怎么作???
如果主窗口关闭了,
这个对话框也会相应的关闭了.
======================
请你自己动手尝试一下,好吗?
2,遍历所有次进程的窗口,然后循环CLOSE
3.....
然后把我的程序里面的是从CDialog继承下来的全部替换!!!
我试了
可以的
技术上可行
符合你的要求吗?
如果不明白
请给我发短消息
请附: 帖子的地址
或在
http://www.338888.com/VCShare/Default.asp
上提问
和
SendMessage都不行
AfxAbort();
一了百了了。试试:AfxGetMainWnd() ->EnableWindow(true);
再点主对话框的关闭按钮。我也没试过。呵呵
{
// TODO: Add your control notification handler code here
this->PostMessage(WM_CLOSE,0,0);
::PostMessage(AfxGetMainWnd()->GetSafeHwnd(),WM_CLOSE,0,0);
}void CDlgScrDlg::OnButton1()
{
// TODO: Add your control notification handler code here
m_dlg.Create(IDD_DIALOG1);
m_dlg.ShowWindow(SW_SHOW);
}
void CAboutDlg::OnButton1()
{
// TODO: Add your control notification handler code here
this->PostMessage(WM_CLOSE,0,0);
CWnd *pWnd=this;
while((pWnd=pWnd->GetParent())!=NULL)
{
::PostMessage(pWnd->GetSafeHwnd(),WM_CLOSE,0,0);
}
}
你的AfxGetMainWnd()->DestroyWindow();
在我的测试例子中可用.: enoloo(努力COM
你的Exit(0);也行.但是你们两个的我还得严格的测试内存泄漏问题.
: bluebohe(薄荷)
你还是没有看明白我的问题,我并不需要主动去点击我DoModal出来的对话框!!!
CWnd *pWnd=this;
while((pWnd=pWnd->GetParent())!=NULL)
{
::PostMessage(pWnd->GetSafeHwnd(),WM_CLOSE,0,0);
}
{
AfxInitRichEdit();
AfxEnableControlContainer();
#ifdef _AFXDLL
Enable3dControls(); // Call this when using MFC in a shared DLL
#else
Enable3dControlsStatic(); // Call this when linking to MFC statically
#endif CDlgHide dlgparent;
dlgparent.Create(IDD_DIALOG_HIDE);
dlgparent.ShowWindow(SW_HIDE);
m_pHideParent = &dlgparent;
CMDMainDlg dlg(&dlgparent);
m_pMainWnd = &dlg; dlg.DoModal();
dlgparent.DestroyWindow();
return FALSE;
}
我在CMDMainDlg 里面creat了一个聊天的窗口DLgChat(父窗口是m_pHideParent而不是m_pMainWnd),
而在这个DlgChat里面我DoModal了一个群组消息的对话框,
群组消息对话框的父窗口是DlgChat,
我有一个托盘图标,消息处理函数在CMDMainDLg里面,我点击托盘的"退出"时候往CMDMainDlg发一个消息,想把此时的CMDMainDlg和CDlgChat还有在CDlgChat里面DoModal的对话框全部关掉!而现在是把CMDMainDLg关掉了,而CDlgChat和那个DoModal的群发消失对话框还在!
Exit(0)有内存泄漏!void CMDMainDlg::OnButtonClose()
{
AfxGetMainWnd()->DestroyWindow();
((CMDMainApp*)AfxGetApp())->m_pHideParent->DestroyWindow();
}其实我原来是给那个m_pHideParent发了一个WM_CLOSE过的,但是没有发Destory消息,我觉的那样太暴力了.感谢楼上的
: he_zhidan(何志丹:风云伐日)
: enoloo(努力COM
: bluebohe(薄荷)
: lixiaosan(小三)
我并不需要知道每一个打开的窗口,我只需要作的是把属于我的每个对话框给安全的CLOSE,所以我用我的上面办法了,其实回过头来我走了很大弯路.