C ++ MFC Feature Pack -> Criar vários CDockablePanes em um CDialog

Tento criar uma área em um CDialog, onde posso colocar alguns CDockablePanes. Esses devem ser perfeitamente encaixáveis em um conteúdo fixo da caixa de diálogo.

O exemplo de painéis de diálogo Codejock é exatamente o que eu quero, mas realizado com as classes do feature pack do MFC:http://codejock.com/downloads/samples/dockingpane.asp

No momento, recebi uma classe herdada do CFrameWndEx, que está incorporada no CDialog. Eu também tenho um CDockablePane em funcionamento. Posso desencaixá-lo e movê-lo, mas quando quero encaixá-lo, o programa trava.

Isso ocorre porque a classe do painel acoplável tenta gerar um painel fictício para visualizar para onde o painel real iria. Chama GetTopLevelFrame () que retorna NULL. Isso produz a falha no afxpane.cpp @CreateEx ().

Alguém tem alguma ajuda ou idéias para mim? :(

Saudações,

Editar:
Ok, algum código:
Eu escrevi uma pequena classe herdada de CFrameWndEx (porque seu construtor 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
};

Agora eu integrei essa classe no meu CDialog e alterei seu tamanho para o tamanho das caixas 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();
    ...
}

No OnCreate () da classe CMyFrame, configurei o CDockablePane e encaixei:

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;
}

questionAnswers(2)

yourAnswerToTheQuestion