如何将CPaneDialog停靠到MainFrm和..?

时间:2009-12-11 21:17:57

标签: user-interface mfc mfc-feature-pack docking

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

如何将CPaneDialog停靠到MainFrm窗口?

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

2 个答案:

答案 0 :(得分:2)

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

  1. 获取对话框资源并将其放入CDialogBar类。
  2. 现在从CDockablePane
  3. 派生一个类
  4. 在窗格的OnCreate方法中,创建对话框。
  5. 另外两件事:

    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,它对我有用。

答案 1 :(得分:0)

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

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

我非常肯定MFC9中有关此漏洞的新人 - 因此在SetPaneSize演示中显而易见的解决方法(调用CDockablePane :: DockToWindow而不是DockPane,因为它用于所有其他可停靠窗口)。但至少它已在MFC10中修复。

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