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消息处理函数 - void CDragList::OnLButtonDown(UINT nFlags, CPoint point)
- {
- if(m_bDrag)
- { m_pDrgImg->EndDrag(); m_bDrag = FALSE;
- }
- CListCtrl::OnLButtonDown(nFlags, point);
- }
- void CDragList::OnMouseMove(UINT nFlags, CPoint point)
- {
- if(m_bDrag)
- {
- CPoint pt;
- pt.x = point.x;
- pt.y = point.y + (m_nItmIndex + 1) * 15;//纵轴坐标偏移
- m_pDrgImg->DragMove(pt);
- }
- CListCtrl::OnMouseMove(nFlags, point);
- }
复制代码- void CDragList::OnLButtonUp(UINT nFlags, CPoint point)
- {
- if(m_bDrag)
- {
- m_pDrgImg->EndDrag();
- m_bDrag = FALSE;
- char name[256];
- LV_ITEM lvi;
- CString subitem[3];
- for(int i=2;i>=0;i--)
- {
- ZeroMemory(&lvi,sizeof(LV_ITEM));
- lvi.iItem = m_nItmIndex;
- lvi.iSubItem = i;
- lvi.mask = LVIF_IMAGE | LVIF_TEXT;
- lvi.pszText = name;
- lvi.cchTextMax = 255;
- GetItem(&lvi);
- subitem[i].Format("%s",name);
- }
- InsertItem(&lvi);
- SetItemText(m_nItmIndex,1,subitem[1]);
- SetItemText(m_nItmIndex,2,subitem[2]);
- }
- CListCtrl::OnLButtonUp(nFlags, point);
- }
- void CDragList::OnBegindrag(NMHDR* pNMHDR, LRESULT* pResult)
- {
- HD_NOTIFY * phdn = (HD_NOTIFY *) pNMHDR;
- // TODO: Add your control notification handler code here
- POINT pt;
- m_nItmIndex = ((NM_LISTVIEW *)pNMHDR)->iItem;
- m_pDrgImg = CreateDragImage(m_nItmIndex,&pt);
- m_pDrgImg->BeginDrag(0,pt);
- ClientToScreen(&pt); //转换客户坐标到屏幕坐标
- m_pDrgImg->DragEnter(this,pt);
- m_bDrag = TRUE;
- *pResult = 0;
- }
复制代码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,"*********");
到此通过鼠标拖拽子项就可以实现 子项的拖拽与复制功能了
我们来演示下实现过程
|