Цитата(Earnest @ 27.2.2009, 15:23) | Код | // это в карту обработчиков ON_NOTIFY_REFLECT (TVN_SELCHANGED, OnSelChanged)
// ловим изменение выделения (поддержка множественного выделения) void CLayerCtrl::OnSelChanged (NMHDR* pNMHDR, LRESULT* pResult) { *pResult=0; NMTREEVIEW* pnmtv = reinterpret_cast<NMTREEVIEW*>(pNMHDR); HTREEITEM hItem = pnmtv->itemNew.hItem; if (GetKeyState(VK_CONTROL) < 0) SelectItem (m_hStartItem = hItem, Toggle); else if (m_hStartItem && GetKeyState(VK_SHIFT) < 0) // выделяем последовательность элементов SelectItems (m_hStartItem, hItem); else // выделяем только текущий элемент SelectItems (m_hStartItem=hItem, hItem); }
void CLayerCtrl::SelectItem (HTREEITEM hItem, int nSelect) { if (nSelect == Toggle) nSelect = ItemSelected (hItem) ? Unselect : Select;
if (nSelect == Select) { Insert (m_Selection, hItem); // добавляем в m_Selection SetItemState (hItem, TVIS_SELECTED, TVIS_SELECTED); if (m_Selection.size() == 1) CTreeCtrl::SelectItem (hItem); } else { Erase (m_Selection, hItem); // удаляем из m_Selection SetItemState (hItem, 0, TVIS_SELECTED); } }
// выделить последовательность между заданными элементами включительно void CLayerCtrl::SelectItems (HTREEITEM hItemFrom, HTREEITEM hItemTo) { // снимаем старое выделение // m_Selection - это отсортированный вектор HTREEITEM for (CSelection::iterator it = m_Selection.begin(); it != m_Selection.end(); ++it) SetItemState (*it, 0, TVIS_SELECTED); m_Selection.clear();
// новое выделение: определяем, кто первый if (!hItemFrom) hItemFrom = hItemTo; if (hItemFrom != hItemTo) { RECT rFrom,rTo; if (!GetItemRect (hItemFrom, &rFrom, false)) hItemFrom = hItemTo; else { // hItemTo всегда должен быть видимым: это последний клик! VERIFY (GetItemRect (hItemTo, &rTo, false)); if (rFrom.top > rTo.top) std::swap (hItemFrom, hItemTo); } } // перебираем в порядке видимости и выделяем for (HTREEITEM hItem = hItemFrom; hItem!=0; hItem = GetNextVisibleItem (hItem)) { SelectItem (hItem, Select); if (hItem == hItemTo) break; } }
bool CLayerCtrl::ItemSelected(HTREEITEM hItem) const { return std::binary_search (m_Selection.begin(), m_Selection.end(), hItem); }
|
|
Если смогу достучаться ,)
Проблемка: при ctrl вроде в список добавляется, а вот выделить не получается.. При этом пробовал вместо TVIS_SELECTED -> TVIS_BOLD - работает.... Хм, интересно, что с шифтом работает....
|