Так что я подумал, что это будет довольно просто, но я забыл, что это MFC. Вместо регистрации получателя уведомлений об изменениях модели данных, которые, возможно, потребуют обновления графического интерфейса для каждого отдельного элемента управления, я думаю, почему бы не зарегистрировать его один раз, а затем отправить сообщение всем панелям открытых док-станций и позволить им при необходимости обновить свои элементы управления собственные условия эффективности.
Моя функция обратного вызова для обработки уведомлений с сервера выглядит примерно так:
void CMainFrame::ChangeCallback(uint32_t nNewVersion, const std::vector<uint32_t>& anChangedObjectTypes)
{
CObList panes;
GetDockingManager()->GetPaneList(panes); // assert failure
if (!panes.IsEmpty())
{
POSITION pos = panes.GetHeadPosition();
while (pos)
{
CDockablePane* pPane = dynamic_cast<CDockablePane*>(panes.GetNext(pos));
if (pPane)
pPane->PostMessage(DM_REFRESH, nNewVersion);
}
}
}
Ошибка, которую я получаю, - ошибка подтверждения в строке 926 файла wincore.cpp
CHandleMap* pMap = afxMapHWND();
ASSERT(pMap != NULL); // right here
Ниже этого комментария говорится, что это может произойти, если вы передаете управление между потоками, однако это однопоточное приложение MFC, и все это делается из основного фрейма.
Кто-нибудь знает, что еще может вызвать это?
Если есть другой способ отправки сообщения всем открытым CDockablePane
производным окнам в MFC, который также работает ...