Pregunta

Intento crear un área en un Cdialog, donde puedo poner algunos CDOCkablePanes. Esos serán perfectamente acoplables para un contenido de diálogo fijo.

La muestra de paneles de diálogo CodeJock es exactamente lo que quiero, pero realizado con las clases de paquete de funciones 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 obtuve un cdockablepane que funciona. Puedo desacoplarlo y moverlo, pero cuando quiero atracarlo, el programa se bloquea.

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

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

Saluda,


Editar:
Bien, algún 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 incrusté esta clase en mi cdialog y cambié su tamaño al tamaño de los 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 el OnCreate () de la clase CMYFrame, configuré el CDOCKablePane y lo dock:

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;
}
¿Fue útil?

Solución

Bien, finalmente lo obtuve.

En lugar de dejar que el MFC cree el DummyWnd, lo creé solo. Entonces, el MFC omite la creación y la llamada a GetToPlevelfRame ().

Ahora el problema era que la variable miembro de DummyWND estaba protegida y no tenía un método de conjunto público. Así que heredé una clase y construí un método de conjunto público.

Otros consejos

Otro método simple es establecer su modo de acoplamiento en dt_immediate si está en un DLG implementando marcos de acoplamiento. Llamar cdockingmanager :: setDockingMode (dt_immediate);

en su objeto CFRameWndex OnCreate (o en algún lugar apropiado).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top