void COptionTree::EnsureVisible(COptionTreeItem *otiItem) { // Declare variables COptionTreeItem* otiParent; CRect rcClient; CPoint ptPoint; long lOY; // Make sure valid if (otiItem == NULL) { return; } // Item is not scroll visible (expand all parents) if (IsItemVisible(otiItem) == FALSE) { otiParent = otiItem->GetParent(); while (otiParent != NULL) { otiParent->Expand(); otiParent = otiParent->GetParent(); } UpdatedItems(); UpdateWindow(); } // Item should be visible if (IsItemVisible(otiItem) == FALSE) { return; } // Calculate list client rectangle m_otlList.GetClientRect(rcClient); rcClient.OffsetRect(0, m_ptOrigin.y); rcClient.bottom -= otiItem->GetHeight(); // Get item location ptPoint = otiItem->GetLocation(); //when the item is at the end will get a bug ,so avoid it ptPoint.y -= 2; if (!rcClient.PtInRect(ptPoint)) { if (ptPoint.y < rcClient.top) { lOY = ptPoint.y; } else { lOY = ptPoint.y - rcClient.Height() + otiItem->GetHeight(); } m_otlList.OnVScroll(SB_THUMBTRACK, lOY, NULL); } }