Criando painéis de encaixe no CView em vez de CMainFrame

Ao criar um aplicativo MDI com estilo "Visual Studio" usando o AppWizard do VS2008 (mais Feature Pack), a classe CMainFrame obtém um método CreateDockingWindows() .

Como eu não quero que todos os painéis estejam sempre visíveis, mas os exiba dependendo do tipo do documento ativo, eu fiz essas janelas para membros de minhas views e também movi a criação para OnInitialUpdate() . Eu crio esses painéis da mesma maneira como foi feito pelo CMainFrame incluindo a configuração do quadro principal como janela pai.

As posições das janelas de encaixe são salvas no registro automaticamente, mas não serão restauradas porque as janelas de encaixe ainda não existem quando o quadro é inicializado.

É uma boa ideia criar as janelas de encaixe com as vistas ou devo esperar mais problemas? Existe uma maneira melhor de realizar o que eu quero?

Desde já, obrigado!

1

1 Respostas

A solução a seguir acabou por funcionar muito bem para mim.

O MainFrame ainda possui todos os painéis, mantendo assim toda a funcionalidade de estrutura existente.

Eu deriva os painéis de uma classe que implementa o comportamento "CView-like" que eu preciso:

/**
 * \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
adicionado