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);

}

 

posted @ 2022-06-26 21:02  XGZ21  阅读(637)  评论(0编辑  收藏  举报