Crearea panourilor de andocare în CView în loc de CMainFrame

Atunci când creați o aplicație MDI cu stil "Visual Studio" folosind AppWizard din VS2008 (plus Feature Pack), clasa CMainFrame devine o metodă CreateDockingWindows() .

Deoarece nu vreau ca toate panourile să fie întotdeauna vizibile, dar să le afișeze în funcție de tipul documentului activ, am făcut aceste ferestre membrilor opiniilor mele și mi-am mutat creația în OnInitialUpdate() . Creez aceste panouri în același mod ca și cel făcut de CMainFrame , inclusiv setarea cadrului principal ca fereastră părinte.

Pozițiile ferestrelor de andocare se salvează în registry în mod automat, dar nu vor fi restaurate, deoarece ferestrele de andocare nu există încă atunci când cadrul este inițializat.

Este o idee bună să creați ferestrele de andocare cu vizualizări sau ar trebui să mă aștept la mai multe probleme? Există o cale mai bună de a realiza ceea ce vreau?

Mulțumesc anticipat!

1

1 răspunsuri

Următoarea soluție sa dovedit a funcționa destul de bine pentru mine.

MainFrame deține în continuare toate panourile, păstrând astfel toate funcționalitățile existente.

Eu derivă geamurile dintr-o clasă care implementează comportamentul "CView-like" de care am nevoie:

/**
 * \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
adăugat