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

时间:2009-04-02 20:59:14

标签: c++ mfc mfc-feature-pack

在我们的一个应用程序中,我使用了一些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);

这样可以看到侧边栏窗口出现,但它似乎不是可移动的,也没有正确绘制。

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

4 个答案:

答案 0 :(得分:2)

这是我作为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(以确保用户无法在一定的最小值以下调整对话框的大小)。我的代码中没有看到任何其他内容,并且停靠窗格的大小调整正常。

答案 1 :(得分:1)

如果我们都在黑暗中射击,我们将击中某些东西的几率增加一倍。

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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