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

  • On-demand Event Event Date: December 18, 2014 The Internet of Things (IoT) incorporates physical devices into business processes using predictive analytics. While it relies heavily on existing Internet technologies, it differs by including physical devices, specialized protocols, physical analytics, and a unique partner network. To capture the real business value of IoT, the industry must move beyond customized projects to general patterns and platforms. Check out this webcast and join industry experts as …

  • On-demand Event Event Date: October 29, 2014 It's well understood how critical version control is for code. However, its importance to DevOps isn't always recognized. The 2014 DevOps Survey of Practice shows that one of the key predictors of DevOps success is putting all production environment artifacts into version control. In this webcast, Gene Kim discusses these survey findings and shares woeful tales of artifact management gone wrong! Gene also shares examples of how high-performing DevOps …

Most Popular Programming Stories

More for Developers

RSS Feeds