Creating Drag Image for a CTreeCtrl without images

WEBINAR: On-demand webcast

How to Boost Database Development Productivity on Linux, Docker, and Kubernetes with Microsoft SQL Server 2017 REGISTER >

The method CreateDragImage is used during drag'n drop to create a drag image. The problem is that it only works for a CTreeCtrl with images. The following method, CreateDragImageEx, checks whether the CTreeCtrl has a valid normal CImageList. If so, it just calls the standard CreateDragImage method and returns.

If, on the other hand, no valid CImageList is found, a bitmap is created based on the size of item rect, and the item text is drawn into it. Then a CImageList is created and the bitmap is added to it.


CImageList* CTreeCtrlEx::CreateDragImageEx(HTREEITEM hItem)
{
	if(GetImageList(TVSIL_NORMAL) != NULL)
		return CreateDragImage(hItem);

	CRect rect;
	GetItemRect(hItem, rect, TRUE);
	rect.top = rect.left = 0;

	// Create bitmap
	CClientDC	dc (this);
	CDC 		memDC;	

	if(!memDC.CreateCompatibleDC(&dc))
		return NULL;

	CBitmap bitmap;
	if(!bitmap.CreateCompatibleBitmap(&dc, rect.Width(), rect.Height()))
		return NULL;

	CBitmap* pOldMemDCBitmap = memDC.SelectObject( &bitmap );
	CFont* pOldFont = memDC.SelectObject(GetFont());

	memDC.FillSolidRect(&rect, RGB(0, 255, 0)); // Here green is used as mask color
	memDC.SetTextColor(GetSysColor(COLOR_GRAYTEXT));
	memDC.TextOut(rect.left, rect.top, GetItemText(hItem));

	memDC.SelectObject( pOldFont );
	memDC.SelectObject( pOldMemDCBitmap );

	// Create imagelist
	CImageList* pImageList = new CImageList;
	pImageList->Create(rect.Width(), rect.Height(), 
	 ILC_COLOR | ILC_MASK, 0, 1);
	pImageList->Add(&bitmap, RGB(0, 255, 0)); // Here green is used as mask color

	return pImageList;
}


Comments

  • Changing the colour?

    Posted by streetd on 07/17/2006 04:03am

    How do I go about chaning the colour of the text being dragged? All I seem to get is a grey despite SetTextColor() being used to set the colour I need? Thanks Dave

    Reply
  • Saved my butt!

    Posted by streetd on 07/12/2006 08:39am

    This code saved me from having to put images into my tree control, Pel K Txnder is a wizard! Thanks Dave

    Reply
  • Yep. This is excellent. THANKS!

    Posted by Legacy on 02/17/2004 12:00am

    Originally posted by: Mr Antelope

    Nice work!

    Reply
  • It really helped me

    Posted by Legacy on 07/19/2002 12:00am

    Originally posted by: Tulasi Anand

    I was looking for drag drop without the image list and this piece of code really helped

    Reply
  • Wonderfull!!!

    Posted by Legacy on 06/19/2002 12:00am

    Originally posted by: Satya

    It works.

    Reply
  • Drag bitmap is too big

    Posted by Legacy on 11/10/1999 12:00am

    Originally posted by: Geert Delmeiren

    While I was playing with this code (that helped me a lot 
    
    while programming a multiple select treeview with drag & drop functionality)
    I remarked that the created drag bitmap is much too big.
    For one item this is maybe no problem, but in the case of
    multiple selects, this certainly reduces the redrawing
    performance while dragging.

    You can discover it by simply changing 255 in the line

    memDC.FillSolidRect(&rect2, RGB(0, 255, 0));

    into 250, so you see the bitmap range while dragging.

    The reason for this is the code line

    rect.top = rect.left = 0;

    This is my solution (you can check it in the same way):

    1. Remove the code line

    rect.top = rect.left = 0;

    2. Replace the code part

    memDC.FillSolidRect(&rect, RGB(0, 255, 0));
    memDC.SetTextColor(GetSysColor(COLOR_GRAYTEXT));
    memDC.TextOut(rect.left, rect.top, GetItemText(hItem));

    by

    CRect rect2(0,0, rect.Width(), rect.Height());
    memDC.FillSolidRect(&rect2, RGB(0, 255, 0));
    memDC.SetTextColor(GetSysColor(COLOR_GRAYTEXT));
    memDC.TextOut(0, 0, GetItemText(hItem));

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

Top White Papers and Webcasts

  • The software-defined data center (SDDC) and new trends in cloud and virtualization bring increased agility, automation, and intelligent services and management to all areas of the data center. Businesses can now more easily manage the entire lifecycle of their applications and services via the SDDC. This Aberdeen analyst report examines how a strong foundation in both the cloud and internal data centers is empowering organizations to fully leverage their IT infrastructure and is also preparing them to be able …

  • Microsoft Azure® is a leading choice for businesses looking to take advantage of the cloud. Azure is particularly appealing to businesses that have already invested in Microsoft on-premises and are now considering running these applications and other workloads in the cloud. To understand how to make this move to Azure, many businesses are turning to managed service providers (MSPs) with specific Azure expertise. Read this white paper to learn the eight key areas to focus on when considering an MSP for an …

Most Popular Programming Stories

More for Developers

RSS Feeds

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