При создании приложения MDI в стиле «Visual Studio» с помощью мастера приложений VS2008 (плюс пакет функций) класс CMainFrame получает метод CreateDockingWindows().
Поскольку я не хочу, чтобы все панели были всегда видимыми, а отображали их в зависимости от типа активного документа, я сделал эти окна членами своих представлений, а также переместил создание в OnInitialUpdate(). Я создаю эти панели так же, как это было сделано в CMainFrame, включая установку основного фрейма в качестве родительского окна.
Позиции закрепляемых окон автоматически сохраняются в реестре, но они не будут восстановлены, потому что стыковочные окна еще не существуют на момент инициализации фрейма.
Создание стыковочных окон с видами - хорошая идея, или мне следует ожидать большего количества проблем? Есть ли лучший способ добиться того, что я хочу?
Заранее спасибо!





Следующее решение оказалось для меня очень хорошо.
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;
};