C ++ MFC Feature Pack -> Crear múltiples CDockablePanes en un CDialog

Intento crear un área en un CDialog, donde puedo poner algunos CDockablePanes. Estos serán perfectamente acoplables a un contenido de diálogo fijo.

La muestra de paneles de diálogo de Codejock es exactamente lo que quiero, pero realizada con las clases de paquete de características de MFC:http://codejock.com/downloads/samples/dockingpane.asp

En este momento obtuve una clase heredada de CFrameWndEx, que está incrustada en el CDialog. También tengo un CDockablePane en funcionamiento. Puedo desacoplarlo y moverlo, pero cuando quiero acoplarlo, el programa se bloquea.

Esto se debe a que la clase de panel acoplable intenta generar un panel ficticio para obtener una vista previa de dónde iría el panel real. Llama a GetTopLevelFrame () que devuelve NULL. Esto produce el bloqueo en afxpane.cpp @CreateEx ().

¿Alguien tiene alguna ayuda o ideas para mí? :(

Saludos

Editar:
Ok, un código:
Escribí una pequeña clase heredada de CFrameWndEx (porque su constructor está protegido):

class CMyFrame: public CFrameWndEx  
{  
    public:  
    DECLARE_MESSAGE_MAP()  
    afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);  
    CDockablePane m_DockWnd; // Will use an own class inherited from CDockablePane later on
};

Ahora incrusto esta clase en mi CDialog y cambio su tamaño al tamaño de los cuadros de diálogo:

BOOL CMyDlg::OnInitDialog()  
{      
    CRect wndRect;  
    GetWindowRect(wndRect);    
    m_pFrame = new CMyFrame();  
    m_pFrame->Create(NULL, NULL, WS_CHILD | WS_VISIBLE | WS_BORDER, wndRect, this);  
    m_pFrame->MoveWindow(wndRect);

    CDialog::OnInitDialog();
    ...
}

En OnCreate () de la clase CMyFrame configuré el CDockablePane y lo acoplé:

int CMyFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    if (CFrameWndEx::OnCreate(lpCreateStruct) == -1)
        return -1;

    CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerWindows));

    EnableDocking(CBRS_ALIGN_ANY);
    // DT_SMART creates dummy dockable panes for previewing the possible position of  
    // the currently floating pane, this leads to a crash at call to GetTopLevelFrame()
    CDockingManager::SetDockingMode(DT_SMART);
    EnableAutoHidePanes(CBRS_ALIGN_ANY);

    // m_DockWnd is a CDockablePane
    if (!m_DockWnd.Create(_T("Test"), this, CRect(0, 0, 200, 200), TRUE, IDC_DOCK_WND, 
        WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | CBRS_LEFT | CBRS_FLOAT_MULTI))
    {
    TRACE0("Failed to create Properties window\n");
    return 1; // failed to create
    }

    m_DockWnd.EnableDocking(CBRS_ALIGN_ANY);
    DockPane(&m_DockWnd);

    return 0;
}

Respuestas a la pregunta(2)

Su respuesta a la pregunta