Создание стыковочных панелей в CView вместо CMainFrame - PullRequest
1 голос
/ 14 октября 2008

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

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

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

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

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

1 Ответ

1 голос
/ 24 февраля 2009

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

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

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

/**
 * \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;
};
...