以下解决方案对我来说效果很好。
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;
};