IDE:VS2008
效果:父窗口模态,子窗口非模态的相互切换。
新建了个单文档项目,由子菜单项创建模态的父窗口(我利用的create,但做成模态的效果)。
代码如下:
HWND hParent = ::GetActiveWindow();
::EnableWindow(hParent, FALSE);
myDialog* pdlg = new myDialog();
pdlg->Create(IDD_PARENT_DIALOG, this);
pdlg->MoveWindow(400, 400, 350, 200);
pdlg->ShowWindow(SW_SHOW);
在父窗口上加入button:
之后由show导出非模态子窗口:
PostMessage(WM_CLOSE);
SetTimer(1, 100, 0);
myDialog* pdlg = new myDialog();
pdlg->Create(IDD_CHILD_DIALOG, GetParent());
pdlg->ShowWindow(SW_SHOW);
pdlg->parentHwnd = this->GetSafeHwnd();
childHwnd = pdlg->GetSafeHwnd();
请注意:
PostMeesage(WM_CLOSE);一定要加,因为此时消息还在dispatch到父窗口,一直在getmessage,dispatchmessage,发出WM_CLOSE消息后便可释放消息堵塞
(都是个人理解,请指正)
之后再定时器里做子窗口关闭后的动作(重载OnClose也可以)
if(!IsWindow(childHwnd) || !::IsWindowVisible(childHwnd)) //窗口关闭
{
KillTimer(1);
//AfxMessageBox(_T("子窗口已销毁"));
::ShowWindow(GetSafeHwnd(), SW_SHOW);
::UpdateWindow(GetSafeHwnd());
::EnableWindow(::GetParent(GetSafeHwnd()), FALSE);
::EnableWindow(GetSafeHwnd(), TRUE);
::SetActiveWindow(GetSafeHwnd());
}
CDialog::OnTimer(nIDEvent);
这样便可以实现父窗口模态,子窗口非模态的相互切换了。
后续更新多窗口通信问题。