首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在MFC中使用CDockablePane在CFrameWnd中创建C++

如何在MFC中使用CDockablePane在CFrameWnd中创建C++
EN

Stack Overflow用户
提问于 2022-05-19 15:20:56
回答 1查看 115关注 0票数 0

首先,我在另一个类中调用了CFrameWnd的Create方法。

然后,我继续使用CDockablePane的Create方法,FrameWnd作为pParentWnd参数。

第二次创建没有成功,在以下代码中出现了断言:

代码语言:javascript
运行
复制
void CMFCDragFrameImpl::Init(CWnd* pDraggedWnd)
{
    ASSERT_VALID(pDraggedWnd);
    m_pDraggedWnd = pDraggedWnd;

    CWnd* pDockSite = NULL;
    if (m_pDraggedWnd->IsKindOf(RUNTIME_CLASS(CPaneFrameWnd)))
    {
        CPaneFrameWnd* pMiniFrame = DYNAMIC_DOWNCAST(CPaneFrameWnd, m_pDraggedWnd);
        pDockSite = pMiniFrame->GetParent();
    }
    else if (m_pDraggedWnd->IsKindOf(RUNTIME_CLASS(CPane)))
    {
        CPane* pBar = DYNAMIC_DOWNCAST(CPane, m_pDraggedWnd);
        ASSERT_VALID(pBar);

        CPaneFrameWnd* pParentMiniFrame = pBar->GetParentMiniFrame();
        if (pParentMiniFrame != NULL)
        {
            pDockSite = pParentMiniFrame->GetParent();
        }
        else
        {
            pDockSite = pBar->GetDockSiteFrameWnd();
        }
    }

    m_pDockManager = afxGlobalUtils.GetDockingManager(pDockSite);
    if (afxGlobalUtils.m_bDialogApp)
    {
        return;
    }

    ENSURE(m_pDockManager != NULL);  <-----------------------
}

不知怎么的,一个码头经理似乎不见了。难道CFrameWnd不适合CDockablePane吗?还是需要初始化对接管理器?

谢谢你的帮助(欢迎代码片段)!

EN

回答 1

Stack Overflow用户

发布于 2022-05-20 02:38:59

要向项目添加一个可停靠窗格,第一步是从CDockablePane派生一个新类,您必须为OnCreate和OnSize添加两个消息处理程序,并添加一个成员子窗口作为主要内容。简单的CTreePane类应该如下所示:

代码语言:javascript
运行
复制
class CTreePane : public CDockablePane 
{
  DECLARE_MESSAGE_MAP()
  DECLARE_DYNAMIC(CTreePane)
protected:
  afx_msg int OnCreate(LPCREATESTRUCT lp);
  afx_msg void OnSize(UINT nType,int cx,int cy);
private:
  CTreeCtrl m_wndTree ;
};
int CTreePane::OnCreate(LPCREATESTRUCT lp)
{
  if(CDockablePane::OnCreate(lp)==-1)
        return -1;
  DWORD style = TVS_HASLINES|TVS_HASBUTTONS|TVS_LINESATROOT|
                     WS_CHILD|WS_VISIBLE|TVS_SHOWSELALWAYS | TVS_FULLROWSELECT;
  CRect dump(0,0,0,0) ;
  if(!m_wndTree.Create(style,dump,this,IDC_TREECTRL))
        return -1;
  return 0;
}

在OnSize处理程序中,您应该调整控件的大小,以填充整个可停靠窗格工作区。

代码语言:javascript
运行
复制
void CTreePane::OnSize(UINT nType,int cx,int cy)
{
  CDockablePane::OnSize(nType,cx,cy);
  m_wndTree.SetWindowPos(NULL,0,0,cx,cy, SWP_NOACTIVATE|SWP_NOZORDER);
}

若要在框架中支持可停靠窗格,必须首先从Ex系列框架(CFrameWndEx,CMDIFrameWndEx,.)派生在OnCreate处理程序中,您应该通过设置允许的对接区域、一般属性、智能对接模式、…来初始化对接管理器。等。

代码语言:javascript
运行
复制
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    ...
    CDockingManager::SetDockingMode(DT_SMART);
    EnableAutoHidePanes(CBRS_ALIGN_ANY); 
    ...
}void CMainFrame::OnTreePane()
{
    if(m_treePane && m_treePane->GetSafeHwnd())
    {
        m_treePane->ShowPane(TRUE,FALSE,TRUE);
        return ;
    }
    m_treePane = new CTreePane;
    UINT style = WS_CHILD | CBRS_RIGHT |CBRS_FLOAT_MULTI;
    CString strTitle = _T("Tree Pane");
    if (!m_treePane->Create(strTitle, this,
        CRect(0, 0, 200, 400),TRUE,IDC_TREE_PANE, style))
    {
        delete m_treePane;
        m_treePane = NULL ;
        return ;
    }
    m_treePane->EnableDocking(CBRS_ALIGN_ANY);
    DockPane((CBasePane*)m_treePane,AFX_IDW_DOCKBAR_LEFT);
    m_treePane->ShowPane(TRUE,FALSE,TRUE);
    RecalcLayout();
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72307153

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档