工控编程吧
标题:
77上位机VC MFC列表视图拖拽视图子项功能
[打印本页]
作者:
qq263946146
时间:
2015-12-10 23:14
标题:
77上位机VC MFC列表视图拖拽视图子项功能
(, 下载次数: 1)
上传
点击文件名下载附件
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,"*********");
到此通过鼠标拖拽子项就可以实现 子项的拖拽与复制功能了
我们来演示下实现过程
[iqiyi]http://player.video.qiyi.com/a5758da9a2c874daed4b26a9911110e2/0/0/w_19rt6t03bh.swf-albumId=5007528609-tvId=5007528609-isPurchase=0-cnId=12[/iqiyi]
(, 下载次数: 0)
上传
点击文件名下载附件
[note]1[/note]
欢迎光临 工控编程吧 (https://www.gkbc8.com/)
Powered by Discuz! X3.4