А я когда то просто добавил в исходный класс CTabbedChildWindow вот такой код:
//-------добавлена мной обработка закрытия табулированных окон и функции SetLastViewNoClose и GetLastViewNoClose для блокировки
//-------закрытия необходимых приложению окон
private:
INT m_lastViewNoClose; //last number of tab which cannot be closed, -1 all closed
public:
void SetLastViewNoClose(INT num) { m_lastViewNoClose = num;}
INT GetLastViewNoClose() { return m_lastViewNoClose; }
BEGIN_MSG_MAP(thisClass)
NOTIFY_CODE_HANDLER(CTCN_CLOSE, OnTabClose)//добавлено для обработки кнопки закрытия окна
CHAIN_MSG_MAP(baseClass)
END_MSG_MAP()
LRESULT OnTabClose(int /*idCtrl*/, LPNMHDR pnmh, BOOL& bHandled)
{
LPNMCTCITEM pnmCustomTab = (LPNMCTCITEM)pnmh;
if(pnmCustomTab)
{
if(pnmCustomTab->iItem >= 0 && pnmCustomTab->iItem > m_lastViewNoClose)
{
TTabCtrl::TItem* pItem = m_TabCtrl.GetItem(pnmCustomTab->iItem);
if(pItem)
{
HWND hWndChild = pItem->GetTabView();
if(0 == ::SendMessage(hWndChild, WM_CLOSE, 0, 0L))
{
this->RemoveTab(hWndChild);
}
}
}
}
bHandled = FALSE;
return 0;
}
В результате можно заблокировать закрытие нескольких первых окон и обрабатыватся CTCN_CLOSE, и каждый раз писать не нужно.