Copying an item is simple but Ive listed a function for copying anyway.
This function is used by other functions discussed later and it also contains
a component that we often forget – extensibility. At the end of the function,
the OnItemCopied() function is called to give the derived class the oppurtunity
to update any internal information.
// CopyItem
– Copies an item to a new location
// Returns
– Handle of the new item
// hItem
– Item to be copied
// htiNewParent – Handle
of the parent for new item
// htiAfter
– Item after which the new item should be created
HTREEITEM CTreeCtrlX::CopyItem( HTREEITEM hItem, HTREEITEM htiNewParent,
HTREEITEM htiAfter /*= TVI_LAST*/ )
{
TV_INSERTSTRUCT
tvstruct;
HTREEITEM
hNewItem;
CString
sText;
// get information of the source
item
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();
// Insert the item at proper
location
tvstruct.hParent = htiNewParent;
tvstruct.hInsertAfter = htiAfter;
tvstruct.item.mask = TVIF_IMAGE
| TVIF_SELECTEDIMAGE | TVIF_TEXT;
hNewItem = InsertItem(&tvstruct);
sText.ReleaseBuffer();
// Now copy item data and item
state.
SetItemData( hNewItem, GetItemData(
hItem ));
SetItemState( hNewItem, GetItemState(
hItem, TVIS_STATEIMAGEMASK ),
TVIS_STATEIMAGEMASK );
// Call virtual function to
allow further processing in derived class
OnItemCopied( hItem, hNewItem
);
return hNewItem;
}
void CTreeCtrlX::OnItemCopied(HTREEITEM /*hItem*/, HTREEITEM /*hNewItem*/
)
{
// Virtual function
}
In the class declaration add the following.
public:
HTREEITEM CopyItem( HTREEITEM
hItem, HTREEITEM htiNewParent,
HTREEITEM htiAfter = TVI_LAST );
protected:
virtual void OnItemCopied( HTREEITEM
hItem, HTREEITEM hNewItem );