在我点击图标,但没有拖动的时候,鼠标上的欲拖动图标跟着鼠标了, 应该怎么处理啊?贴出代码,大家帮忙看看!先谢谢了!void CListCtrlEx::OnLButtonDown(UINT nFlags, CPoint point)
{
CListCtrl::OnLButtonDown(nFlags, point); CImageList* pImageList;
CPoint ptItem;
CPoint ptAction; /************************************************************************/
/* 取得这个 listctrl 控件中加入的 CImageList 对象的指针
/************************************************************************/
pImageList = GetImageList(LVSIL_NORMAL);
/************************************************************************/
/*  取得鼠标左键按下的地方是否在图标上,如果在 item 上点击,则返回这个 
/* item 所对应的索引值,否则返回 -1
/************************************************************************/
m_nItemDrag = HitTest(point);
if (-1 != m_nItemDrag)
{
m_bDragging = TRUE;
}
else{ m_bDragging = FALSE; }
if (m_bDragging)
{
m_hWndWiew = m_pMonitor->OnBeginDrag(this);
m_pImageListDrag = new CImageList();
m_pImageListDrag->Create(32, 32, ILC_COLOR16, 2, 0);
m_pImageListDrag->Add(pImageList->ExtractIcon(m_nItemDrag));
m_pImageListDrag->Add(AfxGetApp()->LoadIcon(IDI_FORBID));
m_pImageListDrag->SetBkColor(CLR_NONE);
::GetCursorPos(&ptAction);
::ScreenToClient(m_hWnd, &ptAction);
GetItemPosition(m_nItemDrag, &ptItem); // 获得项的位置
GetOrigin(&m_ptOrigin); // 获取视图原点位置
m_ptDistance = point - ptItem;
m_ptHotSpot = ptAction - ptItem + m_ptOrigin; // 计算光标的热点
m_pImageListDrag->BeginDrag(0, m_ptHotSpot);
ClientToScreen(&ptAction); // 坐标转换
m_pImageListDrag->DragEnter(NULL, ptAction); // 设置拖动图像的初始位置并在该位置绘制图像
SetCapture();
}
}void CListCtrlEx::OnLButtonUp(UINT nFlags, CPoint point)
{
if (m_bDragging) // end of the drag operation
{
m_bDragging = FALSE;
ASSERT(m_pImageListDrag != NULL);
m_pImageListDrag->DragLeave(NULL);
m_pImageListDrag->EndDrag();
delete m_pImageListDrag;
m_pImageListDrag = NULL;
::ReleaseCapture();
Invalidate();
m_pMonitor->OnEndDrag();
}
CListCtrl::OnLButtonUp(nFlags, point);
}void CListCtrlEx::OnMouseMove(UINT nFlags, CPoint point)
{
if (m_bDragging)
{
m_pMonitor->OnDraging();
ClientToScreen(&point); // 客户区坐标转换为屏幕坐标
HWND hWndPermit = ::WindowFromPoint(point); // 获取鼠标所在窗口的句柄
if(hWndPermit == GetSafeHwnd() || m_hWndWiew == hWndPermit)
{
m_pImageListDrag->SetDragCursorImage(0, CPoint(4, 4));
}
else
{
m_pImageListDrag->SetDragCursorImage(1, CPoint(4, 4));
}
m_pImageListDrag->DragMove(point);
}
CListCtrl::OnMouseMove(nFlags, point);
}

解决方案 »

  1.   

    成员变量m_bDragging,构造函数时你没有给它初始化FALSE吧
      

  2.   

    拖动的初始化操作不应该在OnLButtonDown中处理。ListCtrl有个消息LVN_BEGINDRAG,当你开始拖动之前,会激发响应这个消息。所以你吧OnLButtonDown 中处理的代码,写在LVN_BEGINDRAG 消息处理函数中就行了。
      

  3.   

    m_bDragging 我在构造函数中已经初始化了。
    响应了LVN_BEGINDRAG 消息处理的话,拖动图标的时候出现本来应该是透明的颜色的,却全部变成了黑色,没办法弄好,再者考虑到有些实现拖拽的并没有这个消息,所以也想练一下不使用 LVN_BEGINDRAG 消息响应函数,这样已经可以拖动了,只是如果不拖动,只点击的时候,m_pImageListDrag->SetDragCursorImage()设置的图标还粘在光标上。再就是原本应该是透明的颜色在这里显示的却全是黑色呀!现在也没查出来,楼上说的也都解决不了问题!
      

  4.   

    设断点调试,看你点击之后是否执行了OnLButtonUp
      

  5.   

    楼上说的不错,MFC在这里截取了WM_LBUTTONDOWN 消息,所以出现上述情况,现在问题已经解决了,在鼠标出了窗口之后直接改变光标形状就可以,但是不能使用 CListCtrl 类的 CreateDragImage()函数来创建临时CImageList 的对象,呵呵!谢谢各位了!该结贴了,好几天了!