高分求救!CListCtrl重画后的拖曳操作怎么没有显示拖曳中的图标?但是拖曳操作是成功的,附我的源代码
CListBarRoom是继承于CListCtrl的,拥有LVS_ICON属性,类的h文件中有
// Attributes
public:
CImageList m_imageList; // 图标列表
protected:
CImageList *m_pDragImage; // 拖动时的图像
int m_iItemDragS; // 开始拖动的房间的Item索引号
int m_iItemDragD; // 结束拖动的房间的Item索引号
BOOL m_bDragging; // 正在拖动
下面给出与之相关的实现代码
// 重画图标
void CListBarRoom::OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult)
{
*pResult= 0;
LPNMLVCUSTOMDRAW lplvcd = (LPNMLVCUSTOMDRAW)pNMHDR;
switch(lplvcd->nmcd.dwDrawStage)
{
case CDDS_PREPAINT:
{
CRect rc;
GetClientRect(rc);
// 获取DC
CDC *pDC= CDC::FromHandle(lplvcd->nmcd.hdc);
pDC->FillSolidRect(0 , 0 , rc.Width() , rc.Height()
, RGB(0xff,0xff,0xff));
*pResult = CDRF_NOTIFYITEMDRAW;
return;
}
break;
// Modify item text and or background
case CDDS_ITEMPREPAINT:
{
// 获取DC
CDC *pDC= CDC::FromHandle(lplvcd->nmcd.hdc);
// 获取所在行
int nItem = lplvcd->nmcd.dwItemSpec;
// 获取所在区域
CRect rcOld , rcNew;
GetItemRect(nItem, rcOld, LVIR_BOUNDS);
//rcOld.bottom += 25; // +25则每行间的空隙会变成0
rcOld.right -= 4; // 间距 4
rcOld.bottom -= 4; // 间距 4
rcNew = rcOld;
// 画Item
DrawItem(pDC , nItem , rcNew);
// 返回CDRF_SKIPDEFAULT以忽略系统重画
*pResult = CDRF_SKIPDEFAULT;
return;
}
break;
case CDDS_ITEMPREPAINT | CDDS_SUBITEM:
{
int iCol = lplvcd->iSubItem;
int iRow = lplvcd->nmcd.dwItemSpec;
CString sItem = GetItemText(iRow, iCol);
CRect rc;
GetSubItemRect(iRow, iCol, LVIR_BOUNDS, rc);
// get the device context.
CDC *pDC= CDC::FromHandle(lplvcd->nmcd.hdc);
// paint the text centered.
pDC->DrawText(sItem , rc, DT_CENTER);
*pResult= CDRF_SKIPDEFAULT;
}
break;
}
}
// 处理拖曳操作开始
void CListBarRoom::OnBegindrag(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
SAFE_DELETE(m_pDragImage);
m_pDragImage = CreateDragImage(pNMListView->iItem,&pNMListView->ptAction);
if( m_pDragImage == NULL)
return;
m_pDragImage->BeginDrag ( 0,CPoint(8,8) );
CPoint pt = pNMListView->ptAction;
ClientToScreen( &pt );
m_pDragImage->DragEnter ( this,pt ); //"this"将拖曳动作限制在该窗口
SetCapture();
m_iItemDragS = pNMListView->iItem;
m_bDragging = TRUE;
*pResult = 0;
}
// 处理拖曳操作经过
void CListBarRoom::OnMouseMove(UINT nFlags, CPoint point)
{
if( m_bDragging )
{
m_pDragImage->DragMove( point);
m_pDragImage->DragShowNolock( false ); //避免鼠标经过时留下难看的痕迹
int iHit = HitTest(point);
if(iHit != m_iItemDragD)
{
m_iItemDragD = iHit;
}
m_pDragImage->DragShowNolock( true );
}
CListCtrl::OnMouseMove(nFlags, point);
}
// 处理拖曳操作结束
void CListBarRoom::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if( m_bDragging )
{
m_bDragging = FALSE;
m_pDragImage->DragLeave( this );
m_pDragImage->EndDrag();
ReleaseCapture();
SAFE_DELETE(m_pDragImage);
TRACE("OnLButtonUp:%d,%d\n",m_iItemDragS,m_iItemDragD);
if((m_iItemDragS < 0 ) ||(m_iItemDragD < 0 ))
{
return;
}
OnDrag(m_iItemDragS , m_iItemDragD);
}
CListCtrl::OnLButtonUp(nFlags, point);
}