将控制栏/窗格停靠到 CMDIFrameWndEx?

Posted

技术标签:

【中文标题】将控制栏/窗格停靠到 CMDIFrameWndEx?【英文标题】:Docking control bars/panes to CMDIFrameWndEx? 【发布时间】:2009-04-02 20:59:13 【问题描述】:

在我们的一个应用程序中,我使用了一些 MFC 类来允许停靠边栏窗口,大致如下:

CDialogBar* bar = new CDialogBar;
bar->Create(this, IDD, WS_CHILD | WS_VISIBLE | CBRS_RIGHT | CBRS_TOOLTIPS, IDD));
bar->EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_RIGHT | CBRS_ALIGN_LEFT);
DockControlBar(bar, AFX_IDW_DOCKBAR_RIGHT);

这一切都很好。

我现在想在另一个应用程序中做类似的事情。不幸的是,它已被更改为使用 MFC“功能包”中的一些类,这些类非常漂亮,但这种方法不再有效(它断言,我可以通过一些小的修改来修复它,但侧边栏不会出现)。这些新类的文档很糟糕,所以我很难弄清楚我应该做什么。我尝试了似乎是“新”方法:

  CPaneDialog* pane = new CPaneDialog;
  pane->Create("pane", this, TRUE, IDD, WS_VISIBLE | WS_CHILD, IDD);
  EnableDocking(CBRS_ALIGN_RIGHT | CBRS_ALIGN_LEFT);
  AddPane(pane);
  DockPane(pane);

这在出现一个侧边栏窗口时起作用,但它似乎不可移动并且没有正确绘制。

我觉得我在黑暗中拍摄这一切。有人知道正确的方法是什么吗?

【问题讨论】:

【参考方案1】:

这是我作为CMainFrame::OnCreate 的一部分所做的:

if (!m_projectsPane.Create(L"Projects", this, CRect(0,0,0,0), true, IDD_PROJECTSPANE, WS_CHILD|WS_VISIBLE))
    return -1;
AddDockSite();
EnableDocking(CBRS_ALIGN_ANY);
EnableAutoHidePanes(CBRS_ALIGN_ANY);
m_projectsPane.EnableDocking(CBRS_ALIGN_LEFT|CBRS_ALIGN_RIGHT);
DockPane(&m_projectsPane, AFX_IDW_DOCKBAR_RIGHT);

我的m_projectsPane 是一个类,它会捕获ON_WM_GETMINMAXINFO 以填充ptMinTrackSize(以确保用户无法将对话框的大小调整到某个最小值以下)。我在我的代码中没有看到任何其他内容,并且停靠窗格的大小调整工作正常。

【讨论】:

【参考方案2】:

如果我们都在黑暗中射击,我们击中东西的机会就会增加一倍。

查看CDockablePane(CPaneDialog 的父类)的文档,我注意到一个名为EnableGripper 的方法。试试看。

【讨论】:

谢谢,这似乎有所帮助。我想我错过了对窗格 - > EnableDocking 的调用,并且它和抓手的组合似乎已经大大改善了事情:-)【参考方案3】:

我仍然无法将 CDialogBox 停靠在主框架上。当我这样做时,它只是显示为浮动的空迷你框框。在盒子内部,有一个刷新问题,屏幕上的所有内容都被绘制在那里。

我注意到的是:如果 CPaneDialog 停靠在其他 CDockablePane 上,它会正确显示。但如果它停靠在 MainFrm 上,则不是。这很有趣,因为 CPaneDialog 也是 CDockablePane 的子类。其他 CDockablePane 停靠在 MainFrm 上没有问题。 (使用 MFC Featurepack 示例中的 SetPaneSize 示例进行测试。)

【讨论】:

似乎微软尽一切可能阻止人们。 CDialogBar 很可能无法与新的 CFrameWndEx 一起使用。【参考方案4】:

虽然这可能不再惠及原本需要的人。 问题可能是您在 Visual Studio 中添加的资源对话框上的设置。 由于此控件会在创建对话框时产生,因此您可能提供给 Create() 方法的任何/所有样式都将被资源文件中的设置覆盖。确保 visible 属性设置为 True,Transparent 设置为 False。我这样做了,通过 DockPane() 将 CPaneDialog 添加到主框架没有问题。

【讨论】:

谢谢,但它被设置为可见=真和透明=假;我认为应用程序可能存在一些微妙之处,这使得这比它应该做的要困难得多(窗格被添加到一个大小适中的现有应用程序中,谁知道什么奇怪的覆盖可能会造成麻烦)。前段时间我解决了一些问题,但希望你的建议对其他人有用:)

以上是关于将控制栏/窗格停靠到 CMDIFrameWndEx?的主要内容,如果未能解决你的问题,请参考以下文章

MFC 功能包 - 关闭后无法显示可停靠窗格

使用 MFC Feature Pack 1 在 VS2008 中停靠选项卡式窗格位置

Revit 可停靠窗格对最小宽度没有反应

PySide,将窗口停靠到任务栏

在 CChildFrame 中创建的可停靠窗格在第二次应用时不可见。开始

在 HTML 中进行拆分窗格的最佳方法 [关闭]