MFC完成主窗口和子窗口的非模态切换,并将子窗口独立于主窗口外
时间: 2023-07-19 07:04:48 浏览: 248
实现主窗口和子窗口的非模态切换可以通过以下步骤实现:
1. 在主窗口的类中添加一个成员变量,用于保存指向子窗口的指针。
2. 在主窗口的OnInitDialog函数中,创建子窗口并将其隐藏起来,例如:
```
m_pChildWnd = new CChildWnd();
m_pChildWnd->Create(NULL, _T("Child Window"), WS_CHILD | WS_VISIBLE, CRect(0, 0, 0, 0), this, 0);
m_pChildWnd->ShowWindow(SW_HIDE);
```
3. 在主窗口的菜单或工具栏中添加一个按钮或菜单项,用于触发切换子窗口的操作。
4. 在主窗口的类中添加一个响应该按钮或菜单项的函数,例如:
```
void CMainFrame::OnToggleChildWindow()
{
if (m_pChildWnd->IsWindowVisible())
{
m_pChildWnd->ShowWindow(SW_HIDE);
}
else
{
m_pChildWnd->ShowWindow(SW_SHOW);
}
}
```
5. 在子窗口的类中添加一个响应关闭按钮的函数,例如:
```
void CChildWnd::OnClose()
{
ShowWindow(SW_HIDE);
}
```
6. 在主窗口的类中重载PreTranslateMessage函数,用于拦截ESC键,例如:
```
BOOL CMainFrame::PreTranslateMessage(MSG* pMsg)
{
if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_ESCAPE)
{
if (m_pChildWnd->IsWindowVisible())
{
m_pChildWnd->ShowWindow(SW_HIDE);
return TRUE;
}
}
return CFrameWnd::PreTranslateMessage(pMsg);
}
```
这样就可以实现主窗口和子窗口的非模态切换了。如果要将子窗口独立于主窗口外,可以将步骤2中的this参数改为NULL,这样就可以将子窗口创建为一个独立的窗口了。
阅读全文