【问题标题】: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;
};