使用VS2008的应用程序向导(以及Feature Pack)创建具有“Visual Studio”样式的MDI应用程序时,CMainFrame
类将获取方法CreateDockingWindows()
。
由于我不希望所有窗格始终可见,但根据活动文档的类型显示它们,我将这些窗口设置为我的视图成员,并将创建移动到OnInitialUpdate()
。我以与CMainFrame
相同的方式创建这些窗格,包括将主框架设置为父窗口。
停靠窗口的位置会自动保存到注册表中,但它们将无法恢复,因为初始化框架时对接窗口尚不存在。
使用视图创建停靠窗口是一个好主意还是我应该期待更多问题?有没有更好的方法来实现我想要的目标?
提前致谢!
答案 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;
};