В моем приложении 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().
Как указать менеджеру не возвращать закрытые панели?
или
Как удалить панель из списка панелей, когда она закрыта? забастовка>
Обновлять
Я копнул немного глубже и обнаружил, что объекты CWnd на самом деле не закрываются при нажатии кнопки «x» в строке заголовка, а только их контейнеры.
Таким образом, реальная проблема, похоже, заключается в том, чтобы действительно закрыть панели. .
Я также изменил вопрос, чтобы лучше отразить проблему.