добавить в CMainFram запись в формате MSG, как показано ниже:
ON_REGISTERED_MESSAGE(AFX_WM_ON_PRESS_CLOSE_BUTTON,OnClosePane)
OnClosePane выглядит так:
LRESULT CMainFrame::OnClosePane(WPARAM,LPARAM lp)
{
CBasePane* pane = (CBasePane*)lp;
int id = pane->GetDlgCtrlID();
pane->ShowPane(FALSE, FALSE, FALSE);
RemovePaneFromDockManager(pane,TRUE,TRUE,TRUE,NULL);
AdjustDockingLayout();
pane->PostMessage(WM_CLOSE);
PostMessage(WM_RESETMEMBER,id,0);
return (LRESULT)TRUE;//prevent close , we already close it
}
ПРЕДУПРЕЖДЕНИЕ:
OnClosePane вызывается в середине обработчика CBasePane :: OnLButtonDown, разрушая окно
заставит ваш код утверждать, поэтому вам нужно отправлять сообщение (WM_CLOSE) вместо его отправки, это дает обработчику CBasePane :: OnLButtonDown возможность завершить выполнение, пока панель hWnd все еще действует.
и для того же resone я возвращаю True, чтобы предотвратить закрытие, потому что мы уже закрываем его через
WM_CLOSE, который также уничтожит окно.
WM_RESETMEMBER сообщение является зарегистрированным сообщением окна для сброса элемента панели на ноль.
Это реализация выглядит следующим образом:
LRESULT CMainFrame::OnResetMember(WPARAM wp,LPARAM)
{
int id = (int)wp;
switch(id)
{
case IDC_BIDBOND_TREE_PANE:
m_pBBTreePane.reset((BBTreePane*)NULL);
break;
case IDC_REFTREE_PANE :
m_pRefTreePane.reset((RefTreePane*)NULL);
break;
default :
return (LRESULT)FALSE;//id warent found
}
return (LRESULT)TRUE;
}
вы должны отправить сообщение в виде карты, например:
ON_REGISTERED_MESSAGE(WM_RESETMEMBER,OnResetMember)
и вы должны зарегистрировать сообщение глобально, как это:
const UINT WM_RESETMEMBER = ::RegisterWindowMessage(_T("WM_RESETMEMBER"));