Dynamic Calculation of DragImage Hotspot

Have you ever noticed how, when you drag an item from the left pane in the Explorer, the drag image is always created relative to the cursor position? It looks like you are grabbing the drag item exactly where the cursor is. Here is code that accomplishes this. The key is to dynamically calculate the offset between the cursor and the selected image, and use that as the hotspot.

This code is added to the OnBeginDrag method, immediately before the call to CImageList::BeginDrag. Change variable names as needed to make it work in your code.

        // Calculate the offset to the hotspot
        CPoint offsetPt(8,8);   // Initialize a default offset

        CPoint dragPt = pNMTreeView->ptDrag;    // Get the Drag point
        UINT nHitFlags = 0;
        HTREEITEM htiHit = pMyTree->HitTest(dragPt, &nHitFlags);
        if (NULL != htiHit)
        {
                // The drag point has Hit an item in the tree
                CRect itemRect;
                if (pMyTree->GetItemRect(htiHit, &itemRect, FALSE))
                {
                        // Count indent levels
                        HTREEITEM htiParent = htiHit;
                        int nIndentCnt = 0;
                        while (htiParent != NULL)
                        {
                                htiParent = pMyTree->GetParentItem(htiParent);
                                nIndentCnt++;
                        }

                        // Calculate the new offset
                        offsetPt.y = dragPt.y - itemRect.top;
                        offsetPt.x = dragPt.x - (nIndentCnt * pMyTree->GetIndent()) + GetScrollPos(SB_HORZ);
                }
        }

        // Begin the Drag operation using the Drag image and the calculated hotspot offset
        m_pDragImage->BeginDrag(0, offsetPt);



Comments

  • Why to count indent levels?

    Posted by Legacy on 04/25/2000 12:00am

    Originally posted by: Tomas Brotz

    Simply get the text bounding rectangle and substract one indent. You save the while cycle and the GetScrollPos() call.

    // Get the text bounding rectangle
    if (pMyTree->GetItemRect(htiHit, &itemRect, TRUE))
    {
    // Calculate the new offset
    offsetPt.y = dragPt.y - itemRect.top;
    offsetPt.x = dragPt.x - (itemRect.left - pMyTree->GetIndent());
    }

    Reply
  • Account for stateMask bitmap in x offset

    Posted by Legacy on 12/09/1999 12:00am

    Originally posted by: Joey Ting

    Add the following after the new offset calculation.
    
    

    UINT nState;
    if(nState=GetItemState( htiHit, LVIS_STATEIMAGEMASK ) ){
    (nState>>=12)--;
    IMAGEINFO ImageInfo;
    //State Image list
    m_ImageListState.GetImageInfo(nState,&ImageInfo);
    offsetPt.x -= (ImageInfo.rcImage.right-ImageInfo.rcImage.left);
    }

    Reply
  • Taking checkboxes into account

    Posted by Legacy on 05/27/1999 12:00am

    Originally posted by: P�l Kristian T�nder

    The following code also checks for state images
    
    (for instance check boxes)

    CImageList* pList = pMyTree->GetImageList(TVSIL_STATE);
    if(pList) {
    IMAGEINFO info;
    pList->GetImageInfo(1, &info);
    offsetPt.x -= info.rcImage.right-info.rcImage.left;
    }

    Reply
Leave a Comment
  • Your email address will not be published. All fields are required.

Top White Papers and Webcasts

  • Thanks to wide spread cloud hosting and innovations small businesses can meet and exceed the legacy systems of goliath corporations. Explore the freedom to work how you want, with a phone system that will adapt to your evolving needs and actually save you lots of expense—read Get an Enterprise Phone System without High Cost and Complexity. The article clearly illustrates: The only hardware you'll need is phone equipment for advanced voice and fax. How to join all your employees, mobile devices, …

  • Intelligent N+X Redundancy, Placement Affinities, & Future Proofing in the Virtualized Data Center Virtualization brought about the ability to simplify business continuity management in IT. Workload portability and data replication capabilities mean that physical infrastructure failures no longer need impact application services, and they can rapidly be recovered even in the event of complete site failure. However, Enterprises and Service Providers face new challenges ensuring they have enough compute …

Most Popular Programming Stories

More for Developers

RSS Feeds

Thanks for your registration, follow us on our social networks to keep up-to-date