Question

Lors de la création d'une application MDI avec "Visual Studio" Si vous utilisez le style AppWizard de VS2008 (plus le Feature Pack), la classe CMainFrame obtient une méthode CreateDockingWindows () .

Etant donné que je ne veux pas que tous les volets soient toujours visibles mais que je les affiche en fonction du type de document actif, j'ai transformé ces fenêtres en membres de mes vues et j'ai également déplacé la création vers OnInitialUpdate () . Je crée ces volets de la même manière que le faisait CMainFrame , y compris la définition du cadre principal en tant que fenêtre parent.

Les positions des fenêtres d'ancrage sont automatiquement enregistrées dans le registre, mais elles ne seront pas restaurées car les fenêtres d'ancrage n'existent pas encore lorsque le cadre est initialisé.

Est-ce une bonne idée de créer les fenêtres d'ancrage avec les vues ou devrais-je m'attendre à plus de problèmes? Y a-t-il une meilleure façon d'accomplir ce que je veux?

Merci d'avance!

Était-ce utile?

La solution

La solution suivante s'est avérée assez efficace pour moi.

Le MainFrame possède toujours tous les panneaux, conservant ainsi toutes les fonctionnalités du framework existantes.

Je dérive les volets d'une classe qui implémente le "" CView-like" comportement dont j'ai besoin:

/**
 * \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;
};
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top