Pregunta

Al crear una aplicación MDI con " Visual Studio " Al usar el AppWizard de VS2008 (más el paquete de características), la clase CMainFrame obtiene un método CreateDockingWindows () .

Como no quiero que todos los paneles estén siempre visibles pero los muestro 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 hizo el CMainFrame , incluida la configuración del marco principal como ventana principal.

Las posiciones de las ventanas de acoplamiento se guardan en el registro automáticamente, 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 debo esperar más problemas? ¿Hay una mejor manera de lograr lo que quiero?

Gracias de antemano!

¿Fue útil?

Solución

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

El MainFrame sigue siendo propietario de todos los paneles, por lo que mantiene todas las funcionalidades existentes del marco.

Derivo los paneles de una clase que implementa la " CView-like " comportamiento 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;
};
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top