高分求救!CListCtrl重画后的拖曳操作怎么没有显示拖曳中的图标?但是拖曳操作是成功的,附我的源代码

mybios 2005-06-29 01:14:58
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);
}
...全文
139 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
CodeProject-Jerry 2005-07-12
  • 打赏
  • 举报
回复
拖完后 要把ITEM的位置重新设 啊
mybios 2005-06-29
  • 打赏
  • 举报
回复
谢谢大家。。方法都看过了。还是不行。只有第一个可以拖动。其他的都拖不动。。
以前我也做过listctrl的拖曳,但是以前是没有重画的,跟MFC的例子一样。但是重画后就不行了。why
goodboyws 2005-06-29
  • 打赏
  • 举报
回复
msdn里有代码例子
Samples\VC98\mfc\general\listhdr
自己参考一下
goodboyws 2005-06-29
  • 打赏
  • 举报
回复
void CListBarRoom::OnBegindrag(NMHDR* pNMHDR, LRESULT* pResult)
{
...
m_pDragImage->SetDragCursorImage(0, CPoint(0, 0));
m_pDragImage->BeginDrag ( 0,CPoint(8,8) );
...
liuduofu 2005-06-29
  • 打赏
  • 举报
回复
你必须重新刷新你的控件,在拖曳后用UpdateData(FALSE) 看看可以吗!
Zhymax 2005-06-29
  • 打赏
  • 举报
回复
m_pDragImage->DragEnter ( GetDesktopWindow(),pt ); //"this"将拖曳动作限制在该窗口

15,980

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧