MFC MDI框架,激活一个选定的子窗口,显示到前面
折腾了好久,终于可以在文件树中把对应的子窗口激活了。
需要给主框架的MDI客户窗口发WM_MDIACTIVATE消息,消息的中的窗口句柄不是视的句柄,而应该是子窗口框架的句柄。
在Doc文件中把新建文档对应的视的窗口句柄保存到FileView的树节点中。
BOOL CREDTDoc::OnNewDocument() { if (!CRichEditDoc::OnNewDocument()) return FALSE; m_pdwData = new DWORD[100]; m_pdwData[0] = 10; m_pdwData[1] = 20; m_pdwData[2] = (DWORD)this; m_pdwData[3] = (DWORD)GetView()->GetSafeHwnd(); //新建文档的视的窗口句柄 m_pdwData[4] = (DWORD)GetView(); CString szFileName; szFileName = GetTitle(); //把当前视的句柄数据放到FileView的树节点中 m_hFileNode = ((CMainFrame*)(AfxGetApp()->m_pMainWnd))->AddFileName(szFileName, (DWORD_PTR)m_pdwData); return TRUE; }
在FileView的菜单事件中取出树节点上保存的视窗口句柄,并向主框架的MDIClient发激活消息,消息中的窗口句柄是视窗的父窗口句柄。
用现成的弹出菜单的OnProperties事件做测试。
void CFileView::OnProperties() { AfxMessageBox(_T("Properties....")); HTREEITEM hTreeItem; hTreeItem = m_wndFileView.GetSelectedItem(); DWORD* pData; pData = (DWORD*)m_wndFileView.GetItemData(hTreeItem); CMainFrame* pFrame = (CMainFrame*)(AfxGetApp()->m_pMainWnd); HWND hChildFrame = ::GetParent((HWND)pData[3]); //视窗的父窗口句柄 ::SendMessage(pFrame->m_hWndMDIClient, WM_MDIACTIVATE, (WPARAM)hChildFrame,0); //向主框架的MDIClient发激活消息 ::SetWindowText((HWND)pData[3], _T("111111111111111")); CString str; str.Format(_T("%d,%d, %x, %x, "), pData[0], pData[1], pData[2], pData[3]); AfxMessageBox(str); }