QQ登录

只需一步,快速开始

77上位机VC MFC列表视图拖拽视图子项功能

[ 复制链接 ]

77上位机VC MFC列表视图拖拽视图子项功能

77上位机VC MFC列表视图拖拽视图子项功能

77上位机VC MFC列表视图拖拽视图子项功能


功能展示

对列表视图子项的拖拽操作,可以简化用户的操作节省时间,VC有封装了对拖拽操作的函数,我们当前例程就是使用这些拖拽相关的函数,实现列表视图子项的拖拽功能,效果如图;
要点提示
在用户有拖拽操作时,系统都是发送一个LVN_BEGINDRAG消息给我们程序进行处理;此消息对应函数OnBegindrag();所以我们只要在此函数中初始化拖拽操作,再结合鼠标移动及放开消息就可以完成拖拽功能;
拖拽开始时调用 CImageList*m_pDrgImg=CreateDragImage()方法创建一个拖动的图像列表-m_pDrgImg,并通过m_pDrgImg->DragEnter()方法锁定窗口的更新,鼠标移动过程中通过m_pDrgImg->DragMove();移动图像,显示拖动的效果; 鼠标放开时终止图像拖动m_pDrgImg->EndDrag();


这里要注意的是,HDN_BEGINDRAG默认对应函数也是OnBegindrag();这个消息由头控件CHeaderCtrl发送而LVN_BEGINDRAG是列表视图所以父窗口发送;我们这里要处理消息是LVN_BEGINDRAG
实现功能
1.新建基于对话框的应用程序
2.从CListCtrl类派生一自己的类class CDragList : public CListCtrl;添加三个变量private:
int m_nItmIndex;CImageList* m_pDrgImg; BOOL m_bDrag;

3.添加鼠标点击,放开,移动消息函数及LVN_BEGINDRAG消息处理函数
  1. void CDragList::OnLButtonDown(UINT nFlags, CPoint point)
  2. {
  3.         if(m_bDrag)
  4.         { m_pDrgImg->EndDrag(); m_bDrag = FALSE;
  5.         }
  6.         CListCtrl::OnLButtonDown(nFlags, point);
  7. }
  8. void CDragList::OnMouseMove(UINT nFlags, CPoint point)
  9. {
  10.         if(m_bDrag)
  11.         {
  12.                 CPoint pt;
  13.                 pt.x = point.x;
  14.                 pt.y = point.y + (m_nItmIndex + 1) * 15;//纵轴坐标偏移
  15.                 m_pDrgImg->DragMove(pt);
  16.         }
  17.         CListCtrl::OnMouseMove(nFlags, point);
  18. }
复制代码
  1. void CDragList::OnLButtonUp(UINT nFlags, CPoint point)
  2. {
  3.         if(m_bDrag)
  4.         {
  5.                 m_pDrgImg->EndDrag();
  6.                 m_bDrag = FALSE;
  7.                 char name[256];
  8.                 LV_ITEM lvi;
  9.                 CString subitem[3];
  10.                 for(int i=2;i>=0;i--)
  11.                 {
  12.                         ZeroMemory(&lvi,sizeof(LV_ITEM));
  13.                         lvi.iItem                = m_nItmIndex;
  14.                         lvi.iSubItem        = i;
  15.                         lvi.mask                = LVIF_IMAGE | LVIF_TEXT;
  16.                         lvi.pszText                = name;
  17.                         lvi.cchTextMax        = 255;
  18.                         GetItem(&lvi);
  19.                         subitem[i].Format("%s",name);
  20.                 }
  21.                 InsertItem(&lvi);
  22.                 SetItemText(m_nItmIndex,1,subitem[1]);
  23.                 SetItemText(m_nItmIndex,2,subitem[2]);
  24.         }
  25.         CListCtrl::OnLButtonUp(nFlags, point);
  26. }
  27. void CDragList::OnBegindrag(NMHDR* pNMHDR, LRESULT* pResult)
  28. {
  29.         HD_NOTIFY * phdn = (HD_NOTIFY *) pNMHDR;
  30.         // TODO: Add your control notification handler code here

  31.         POINT pt;
  32.         m_nItmIndex = ((NM_LISTVIEW *)pNMHDR)->iItem;
  33.         m_pDrgImg  = CreateDragImage(m_nItmIndex,&pt);
  34.         m_pDrgImg->BeginDrag(0,pt);
  35.         ClientToScreen(&pt);                                                //转换客户坐标到屏幕坐标
  36.         m_pDrgImg->DragEnter(this,pt);
  37.         m_bDrag = TRUE;
  38.         *pResult = 0;
  39. }
复制代码
4.最后是我们自定义的列表视图的应用:添加一列表视图控件关联变量CDragList  m_List;
给此变量设置些属性及添加些子项,供拖拽用;
  m_List.ModifyStyle(0,LVS_REPORT);//报表格式
  m_List.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);//风格事先拖动效果

  m_List.InsertColumn(0,"网站名称",LVCFMT_LEFT,100);
  m_List.InsertColumn(1,"网址",LVCFMT_LEFT,100);
  m_List.InsertColumn(2,"联系QQ",LVCFMT_LEFT,100);
  m_List.InsertItem(0,"工控编程吧");
  m_List.SetItemText(0,1,"gkbc8.com");
  m_List.SetItemText(0,2,"263946146");
  m_List.InsertItem(1,"百度");
  m_List.SetItemText(1,1,"baidu.com");
  m_List.SetItemText(1,2,"*********");
  m_List.InsertItem(2,"淘宝");
  m_List.SetItemText(2,1,"taobao.com");
  m_List.SetItemText(2,2,"*********");

到此通过鼠标拖拽子项就可以实现 子项的拖拽与复制功能了

我们来演示下实现过程

请点击此处下载

请先注册会员后在进行下载

已注册会员,请先登录后下载

文件名称:77.上位机VC MFC列表视图拖拽视图子项功能.rar 
文件大小:157.76 KB  售价:10金币
下载权限: 不限 以上或 VIP会员   [购买捐助会员]   [充值积分]   有问题联系我

  

您的支持是我们创作的动力!  

  

您可花点闲钱积分自助任意充值

  

成为VIP会员 全站资源任意下载永久更新!


回复

使用道具 举报

快速回复 返回列表 客服中心 搜索