15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту


Копирование элемента на новое место

Операция копирования достаточна проста, но все же она здесь приводится. В конце вызывается виртуальная функция, которая обеспечивает своевременное обновление всей внутренней информации. Все это сделано для обеспечения расширяемости.


HTREEITEM CTreeCtrlX::CopyItem( HTREEITEM hItem, HTREEITEM htiNewParent, 
HTREEITEM htiAfter /*= TVI_LAST*/ )
{
 TV_INSERTSTRUCT tvstruct;
 HTREEITEM hNewItem;
 CString sText;

 // берем информацию источника
 tvstruct.item.hItem = hItem;
 tvstruct.item.mask = TVIF_CHILDREN | TVIF_HANDLE | TVIF_IMAGE | TVIF_SELECTEDIMAGE;
 GetItem(&tvstruct.item);
 sText = GetItemText( hItem );

 tvstruct.item.cchTextMax = sText.GetLength();
 tvstruct.item.pszText = sText.LockBuffer();

 // Вставляем элемент в заданное место
 tvstruct.hParent = htiNewParent;
 tvstruct.hInsertAfter = htiAfter;
 tvstruct.item.mask = TVIF_IMAGE| TVIF_SELECTEDIMAGE | TVIF_TEXT;
 hNewItem = InsertItem(&tvstruct);sText.ReleaseBuffer();

 // Теперь копируем данные и состояние элемента
 SetItemData( hNewItem, GetItemData(hItem ));
 SetItemState( hNewItem, GetItemState(hItem, TVIS_STATEIMAGEMASK ),TVIS_STATEIMAGEMASK );

 // Вызываем виртуальную функцию для дальнейшей обработки наследованного класса
 OnItemCopied( hItem, hNewItem);
 return hNewItem;
}
void CTreeCtrlX::OnItemCopied(HTREEITEM /*hItem*/, HTREEITEM /*hNewItem*/)
{
 // Виртуальная функция

}

 

Источник: ProtoSphere