【问题标题】:Creating Docking Panes in CView instead of CMainFrame在 CView 而不是 CMainFrame 中创建停靠窗格
【发布时间】:2010-09-17 03:37:24
【问题描述】:

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

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

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

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

提前致谢!

【问题讨论】:

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


    【解决方案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;
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-22
      • 1970-01-01
      • 2012-03-13
      • 1970-01-01
      相关资源
      最近更新 更多