私の MFC (Feature Pack) アプリケーションでは、ドッキング ペインを動的に作成してチャートやテーブルなどを表示できます
。
次のようなペインを作成します。
// Create CMyDockablePane pPane
pPane->Create(...);
pPane->EnableDocking(CBRS_ALIGN_ANY);
// Create CRect rcPane
pPane->FloatPane(rcPane);
これはうまくいくようです。
これは、ペインが既に存在するかどうかを確認しようとした方法です。ペインは、そのタイプ (クラス) とパラメーターによって識別されます。
BOOL CanOpenPane(const type_info & paneType, const CMyParameter & parameter) const
{
CMainFrame* pFrm = GetMainFrame();
CDockingManager* pDockMan = pFrm->GetDockingManager();
// Check if there already is a pane of the same type which also has the same parameter.
bool canOpen = true;
CObList panes;
pDockMan->GetPaneList(panes);
POSITION pos = panes.GetHeadPosition();
while (pos)
{
CMyDockablePane* pPane = dynamic_cast<CMyDockablePane*>(panes.GetNext(pos));
if (NULL == pPane) { continue; }
if (paneType == typeid(*pPane) &&
pPane->GetParameter() == parameter)
{
canOpen = false;
break;
}
}
return canOpen;
}
これに関する問題は、ペインを閉じると、これが認識されないことです。CDockingManager オブジェクトは、GetPanes() 呼び出しでペインを返します。
閉じているペインを返さないようにマネージャに指示するにはどうすればよいですか?
または
ペインが閉じているときに、ペイン リストからペインを削除するにはどうすればよいですか?
アップデート
もう少し詳しく調べてみると、キャプション バーの [x] ボタンをクリックすると、CWnd オブジェクトが実際には閉じられず、そのコンテナーだけが閉じられていることがわかりました。
したがって、本当の問題は、ペインを実際に閉じることです。
また、問題をよりよく反映するように質問を変更しました。