void CPropTree::Delete(CPropTreeItem* pItem) { if (pItem && pItem!=&m_Root && SendNotify(PTN_DELETEITEM, pItem)) return; // passing in a NULL item is the same as calling DeleteAllItems if (!pItem) pItem = &m_Root; // delete children CPropTreeItem* pIter; CPropTreeItem* pNext; pIter = pItem->GetChild(); while (pIter) { pNext = pIter->GetSibling(); DeleteItem(pIter); pIter = pNext; } // unlink from tree if (pItem->GetParent()) { if (pItem->GetParent()->GetChild()==pItem) { pItem->GetParent()->SetChild(pItem->GetSibling()); UINT nSiblingID = 0; CPropTreeItem* pItemID = pItem->GetParent()->GetChild(); while ( pItemID ) { pItemID->SetSiblingID( nSiblingID++ ); pItemID = pItemID->GetSibling(); } } else { pIter = pItem->GetParent()->GetChild(); while (pIter->GetSibling() && pIter->GetSibling()!=pItem) pIter = pIter->GetSibling(); CPropTreeItem* pItemID = pIter->GetSibling(); if ( pItemID ) { UINT nSiblingID = pItem->GetSiblingID(); while ( pItemID ) { pItemID = pItemID->GetSibling(); if ( pItemID ) pItemID->SetSiblingID( nSiblingID++ ); } pIter->SetSibling(pItem->GetSibling()); } } } if (pItem!=&m_Root) { if (pItem==GetFocusedItem()) SetFocusedItem(NULL); delete pItem; } }