Создание стыковочных панелей в CView вместо CMainFrame

При создании приложения MDI в стиле «Visual Studio» с помощью AppWizard VS2008 (плюс Feature Pack) класс CMainFrame получает метод CreateDockingWindows().

Поскольку я не хочу, чтобы все панели были видны всегда, а отображали их в зависимости от типа активного документа, я сделал эти окна членами своих представлений, а также переместил создание в OnInitialUpdate(). Я создаю эти панели так же, как это было сделано в CMainFrame, включая установку основного фрейма в качестве родительского окна.

Позиции стыковочных окон автоматически сохраняются в реестре, но они не будут восстановлены, поскольку стыковочные окна еще не существуют при инициализации фрейма.

Стоит ли создавать стыковочные окна с представлениями или следует ожидать больше проблем? Есть ли лучший способ выполнить то, что я хочу?

Заранее спасибо!


person foraidt    schedule 14.10.2008    source источник


Ответы (1)


Следующее решение оказалось очень хорошим для меня.

MainFrame по-прежнему владеет всеми панелями, тем самым сохраняя всю существующую функциональность фреймворка.

Я получаю панели из класса, который реализует поведение, похожее на CView, которое мне нужно:

/**
 * \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;
};
person foraidt    schedule 24.02.2009