2

使用 VS2008 的 AppWizard(加上功能包)创建具有“Visual Studio”风格的 MDI 应用程序时,CMainFrame该类获得一个方法CreateDockingWindows()

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

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

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

提前致谢!

4

1 回答 1

1

以下解决方案对我来说效果很好。

MainFrame 仍然拥有所有窗格,因此保留了所有现有的框架功能。

我从一个实现我需要的“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;
};
于 2009-02-24T12:31:16.333 回答