The Wayback Machine - https://web.archive.org/web/20110427190049/http://www.codeguru.com/cpp/controls/treeview/dragdrop/article.php/c695/

    Copy an item to new location




    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 );



    IT Offers