Creating Drag Image for a CTreeCtrl without images 

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;

}