1

我对 CPaneDialog 有疑问。我使用 SetPaneSize MFC 功能包示例项目进行了测试。奇怪的是 CPaneDialog 不能停靠到 MainFrm 而 CDockablePane 可以。CPaneDialog 也是 CDockablePane 的子类,但它不能。只有 DockToWindow( &other_CPaneDialog_instance... ) 是可能的。如果我调用 DockToPane(),则 CPaneDialog 的内容不会正确绘制或刷新。

如何将 CPaneDialog 停靠到 MainFrm 窗口?

另一个问题是关于绘图。如果在 SetPaneSize 示例中删除树控件的代码,则 view1 的内容(CDockablePane 的实例)不会正确重绘。在做了一些实验之后,我决定应该在它的 OnSize 和 OnPaint 方法中做一些事情。(OnSize 更为关键。)这是预期的行为吗?

4

2 回答 2

2

在转换较旧的 MFC 应用程序时,我遇到了与功能包类似的问题。我没有时间正确解决它,但我使用了以下解决方法:

  1. 获取您的对话框资源并将其放入 CDialogBar 类中。
  2. 现在从 CDockablePane 派生一个类
  3. 在窗格的 OnCreate 方法中,创建对话栏。

还有2件事:

void CInputPane::OnSize(UINT nType, int cx, int cy)
{
    CDockablePane::OnSize(nType, cx, cy);
    m_pInputBar->SetWindowPos(NULL,0,0,cx,cy,SWP_NOACTIVATE | SWP_NOZORDER);
}

BOOL CInputPane::OnBeforeFloat(CRect& /*rectFloat*/,AFX_DOCK_METHOD /*dockMethod*/)
{
    return FALSE;
}

这确保了对话框的正确大小并防止用户拖动栏。

HTH,它对我有用。

于 2009-12-11T23:05:09.470 回答
0

将 HexEdit 转换为 MFC9(请参阅http://www.hexedit.com)我遇到了这个问题。我在 VS2010 (MFC10) 中测试过,这个 bug 似乎已经修复。

另请注意,此问题不是主要问题,因为您可以在 CMainFrame::OnCreate 中使用 DockToWindow 停靠到 CDockablePane(如果有的话)。用户可以浮动窗口或将其停靠在别处,当程序重新打开时,该位置将被记住并恢复。

我很确定有人对 MFC9 中的这个 bug 有新的认识 - 因此在 SetPaneSize 演示中明显的解决方法(调用 CDockablePane::DockToWindow 而不是 DockPane 用于所有其他可停靠窗口)。但至少它在 MFC10 中是固定的。

我发现的另一个错误是,如果 CPaneDialog 在关闭(隐藏)时处于浮动状态,那么当您重新启动应用程序时,窗格会重新打开,而不是恢复为正确(隐藏)状态。如果窗格在关闭时停靠,则不会发生这种情况。这也已在 MFC10 中得到修复。

于 2010-03-15T02:31:21.977 回答