Creación de paneles de acoplamiento en CView en lugar de CMainFrame

Al crear una aplicación MDI con el estilo "Visual Studio" con el AppWizard de VS2008 (más Feature Pack), la clase CMainFrame obtiene un método CreateDockingWindows() .

Como no quiero que todos los paneles estén siempre visibles, pero los visualizo según el tipo de documento activo, hice esas ventanas a los miembros de mis vistas y también moví la creación a OnInitialUpdate() . Creo esos paneles de la misma manera que lo hacía el CMainFrame , que incluye establecer el marco principal como ventana principal.

Las posiciones de las ventanas de acoplamiento se guardan automáticamente en el registro, pero no se restaurarán porque las ventanas de acoplamiento aún no existen cuando se inicializa el marco.

¿Es una buena idea crear las ventanas de acoplamiento con las vistas o debería esperar más problemas? ¿Hay una mejor manera de lograr lo que quiero?

¡Gracias por adelantado!

1

1 Respuestas

La siguiente solución resultó funcionar bastante bien para mí.

Mainframe todavía posee todos los paneles, manteniendo así toda la funcionalidad de marco existente.

Derivo los paneles de una clase que implementa el comportamiento "CView-like" que necesito:

/**
 * \brief Mimics some of the behavior of a CView
 *
 * CDockablePane derived class which stores a pointer to the document and offers
 * a behavior similar to CView classes.
 *
 * Since the docking panes are child windows of the main frame,
 * they have a longer live time than a view. Thus the (de-)initialization code
 * cannot reside in the CTor/DTor.
 */
class CPseudoViewPane :
    public CDockablePane,
{
    DECLARE_DYNAMIC(CPseudoViewPane)

public:
    /// Initializes the pane with the specified document
    void Initialize(CMyDoc* pDoc);

    void DeInitialize();

    /// Checks if window is valid and then forwards call to pure virtual OnUpdate() method.
    void Update(const LPARAM lHint);

protected:
    CPseudoViewPane();
    virtual ~CPseudoViewPane();


    CMyDoc* GetDocument() const { ASSERT(NULL != m_pDocument); return m_pDocument; }

    CMainFrame* GetMainFrame() const;

    /**
     * This method is called after a document pointer has been set with #Initialize().
     * Override this in derived classes to mimic a view's "OnInitialUpdate()-behavior".
     */
    virtual void OnInitialUpdate() = 0;

    /**
     * Called by #Update(). Overrider to mimic a view's "OnUpdate()-behavior".
     * This method has a simplified parameter list. Enhance this if necessary.
     */
    virtual void OnUpdate(const LPARAM lHint) = 0;

    DECLARE_MESSAGE_MAP()

private:
    CMyDoc* m_pDocument;
};
1
agregado