在CView而不是CMainFrame中创建停靠窗格

时间:2008-10-14 17:07:00

标签: c++ visual-studio-2008 mfc mfc-feature-pack docking

使用VS2008的应用程序向导(以及Feature Pack)创建具有“Visual Studio”样式的MDI应用程序时,CMainFrame类将获取方法CreateDockingWindows()

由于我不希望所有窗格始终可见,但根据活动文档的类型显示它们,我将这些窗口设置为我的视图成员,并将创建移动到OnInitialUpdate()。我以与CMainFrame相同的方式创建这些窗格,包括将主框架设置为父窗口。

停靠窗口的位置会自动保存到注册表中,但它们将无法恢复,因为初始化框架时对接窗口尚不存在。

使用视图创建停靠窗口是一个好主意还是我应该期待更多问题?有没有更好的方法来实现我想要的目标?

提前致谢!

1 个答案:

答案 0 :(得分: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;
};
相关问题