窗体中某个位置,显示多个对话框当点击某中数据,使不同的窗体显示出来我使用setwindowpos,可是不能正确得到我想要的求助

解决方案 »

  1.   

    我前面做的一个小工具中刚刚用到,现在放出来共享吧//-----------------------------------------------------------------------------
    // 描  述: 添加子窗口页
    //
    // 参  数:
    // uID 对话框模板 ID
    // 返 回 值:
    //-----------------------------------------------------------------------------
    void CPageManager::AddPage(CDialogPage *pDlg, UINT uIDD)
    {
    pDlg->Create(pDlg->m_uTemplateID, m_pParentDialog); if (uIDD != 0)
    m_uPageID[m_uPageCount] = uIDD;
    else
    m_uPageID[m_uPageCount] = pDlg->m_uTemplateID; m_pDialogPage[m_uPageCount] = pDlg; m_uPageCount ++;
    }//-----------------------------------------------------------------------------
    // 描  述: 切换显示页面
    //
    // 参  数:
    // 返 回 值:
    //-----------------------------------------------------------------------------
    void CPageManager::SwitchPage(UINT uIDD)
    {
    CDialogPage *pPage; if (m_uCurrentPage == uIDD)
    return; if (m_uCurrentPage != 0)
    {
    pPage = GetPage(m_uCurrentPage);
    if (pPage)
    pPage->ShowWindow(SW_HIDE); pPage->OnPageHide();
    pPage->m_bVisible = FALSE;
    } pPage = GetPage(uIDD);
    if (pPage)
    {
    pPage->ShowWindow(SW_SHOW);
    pPage->OnPageShow();
    pPage->m_bVisible = TRUE;
    } m_uCurrentPage = uIDD;
    }
      

  2.   

    我在主窗口中用了一个Static,使得所有窗口都依据这个Static的大小来调整大小//-----------------------------------------------------------------------------
    // 描  述: 调整所有页面窗口的位置以适合指定客户区大小
    //
    // 参  数:
    // 返 回 值:
    //-----------------------------------------------------------------------------
    void CPageManager::AdjustPosition(LPRECT pRect)
    {
    CRect rcPosition(pRect); for (UINT u = 0; u < m_uPageCount; u ++)
    m_pDialogPage[u]->MoveWindow(rcPosition.left, rcPosition.top, 
    rcPosition.Width(), rcPosition.Height(), FALSE);
    }
    int CThemeProduceDlg::OnCreate(LPCREATESTRUCT lpCreateStruct) 
    {
    if (CDialog::OnCreate(lpCreateStruct) == -1)
    return -1;

    // 连接数据库
    if ( ! g_objDataKernel.ConnectMDB())
    {
    AfxMessageBox(_T("打开数据库失败"), MB_OK|MB_ICONWARNING);
    return -1;
    } // 创建真彩色工具栏
    if ( ! CreateToolBar() )
    return -1; m_mgrChildPages.AddPage(&m_dlgLibInfo);
    m_mgrChildPages.AddPage(&m_dlgLibAppend);
    m_mgrChildPages.AddPage(&m_dlgPaperInfo);
    m_mgrChildPages.AddPage(&m_dlgPaperManu);
    m_mgrChildPages.AddPage(&m_dlgPaperAuto);

    return 0;
    }void CThemeProduceDlg::OnCMDPaperAuto() 
    {
    m_mgrChildPages.SwitchPage(IDD_DIALOG_PAPER_AUTO);
    SwitchToolBarButton(ID_PAPER_AUTO);
    }void CThemeProduceDlg::AdjustPagePosition()
    {
    CRect rcPage;
    CRect rcPos;
    CRect rcOffset(0, 0, 0, 0); m_staticBorder.GetClientRect(rcPage);
    m_staticBorder.ClientToScreen(rcPage);
    ClientToScreen(rcOffset);
    rcPos.SetRect(rcPage.left - rcOffset.left, rcPage.top - rcOffset.top, 
    rcPage.left - rcOffset.left + rcPage.Width(), 
    rcPage.top - rcOffset.top + rcPage.Height());
    rcPos.DeflateRect(2, 2, 2, 2);

    m_mgrChildPages.AdjustPosition(rcPos);
    }
      

  3.   

    窗体的左边是CTreeCtrl,右边是罗列着一些窗体当树中选择不同的项时,右边相应的显示窗体(现在和多软件在设置的时候都是这种方式)我在cordeproject上下了个这样的程序,想比着做个适合自己的//-------------------------------------------------
    // 初始化树和窗体 CRect rectDlg;
    m_rectCtrl.GetWindowRect(&rectDlg);
    ScreenToClient(&rectDlg);
    POSITION pos;
    pos = m_strListTreeParentItem.GetHeadPosition();
    CString strTemp;
    while(pos)
    {
    strTemp = m_strListTreeParentItem.GetNext(pos);
    if(strTemp.IsEmpty())
    continue; m_tree.InsertItem(strTemp);
    CDlgPropertiesChild *pDlg = new CDlgPropertiesChild();
    pDlg->Create(CDlgPropertiesChild::IDD,this);
    pDlg->SetWindowPos(&wndTop,rectDlg.left,rectDlg.top,rectDlg.Width(),rectDlg.Height(),SWP_HIDEWINDOW );
    m_mapStringToDlg.SetAt(strTemp,pDlg);
    }//------------------------------------------------
    // 相应CTreeCtrl ,OnSelchanged事件void CDlgProperties::OnSelchangedTree(NMHDR* pNMHDR, LRESULT* pResult) 
    {
    NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
    TVITEM item = pNMTreeView->itemNew; HTREEITEM hItem = NULL,hParentItem = NULL;
    hParentItem = m_tree.GetParentItem(item.hItem); CString strDlgName;
    if(hParentItem != NULL)
    strDlgName = m_tree.GetItemText(hParentItem);
    else
    strDlgName = m_tree.GetItemText(item.hItem); void * pDlg = NULL;
    m_mapStringToDlg.Lookup(strDlgName,pDlg); if(pDlg != NULL)
    {
    ControlDataToDlg((CDlgPropertiesChild*)pDlg,strDlgName);
    ::ShowWindow(((CDlgPropertiesChild*)pDlg)->m_hWnd,SW_RESTORE); 
    //::SetWindowPos(((CDlgPropertiesChild*)pDlg)->m_hWnd,HWND_TOP,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE|SWP_SHOWWINDOW);
    ((CDlgPropertiesChild*)pDlg)->SetWindowPos(&wndTop,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE|SWP_SHOWWINDOW);
    //((CDlgPropertiesChild*)pDlg)->SetForegroundWindow();
    //((CDlgPropertiesChild*)pDlg)->BringWindowToTop();
    //((CDlgPropertiesChild*)pDlg)->ShowWindow(TRUE);
    }
    *pResult = 0;
    }