设为首页 加入收藏

TOP

7.5.1 在视图窗口中实现数据拖动
2013-10-07 00:36:53 来源: 作者: 【 】 浏览:66
Tags:7.5.1 口中 实现 数据

7.5  视图窗口高级应用

教学录像:光盘\TM\lx\7\视图窗口高级应用.exe

在前面已经介绍了视图的一些简单应用,本节将介绍视图的高级应用--在视图窗口中拖动数据和在视图窗口中浏览网页。

7.5.1  在视图窗口中实现数据拖动

在列表视图中可以进行数据拖动。首先调用CreateDragImage函数创建一个拖动图像列表。

语法格式如下:

CImageList* CreateDragImage( int nItem, LPPOINT lpPoint );

nItem:要创建的拖动图像列表的列表项索引。

lpPoint:在视图坐标中,决定图像的左上角的初始位置。

然后调用CImageList类的BeginDrag函数开始拖动图像。

语法格式如下:

BOOL BeginDrag( int nImage, CPoint ptHotSpot );

nImage:拖动的图像,基于0的索引。

ptHotSpot:开始拖动处的光标。

调用DragEnter函数在拖动过程中封锁更新,并在指定位置显示拖动图像。

语法格式如下:

static BOOL DragEnter( CWnd* pWndLock, CPoint point );

pWndLock:指向拥有拖动图像的窗口指针。

point:显示拖动图像的位置。

在拖动过程中调用DragMove函数移动正在进行拖动的图像。

语法格式如下:

static BOOL DragMove( CPoint pt );

其中,pt是指新的拖动位置。

在结束时调用EndDrag函数结束拖动操作。

语法格式如下:

static void EndDrag( );

例7.5  在视图窗口中实现数据拖动。(实例位置:光盘\TM\sl\7\5)

步骤如下:

(1)创建一个单文档应用程序,在应用程序向导第6步中将视图的基类改为CListView。

(2)在视图类的头文件中声明变量,代码如下。

int   m_ItmIndex;        //列表项索引
CImageList* m_pDrgImg;        //拖动图像列表
BOOL  m_Drag;         //是否拖动
(3)在视图类的OnInitialUpdate函数中为视图添加数据信息,代码如下。
void CDragViewView::OnInitialUpdate()
{
CListView::OnInitialUpdate();
CListCtrl* pListCtl=&GetListCtrl();
pListCtl->ModifyStyle(0L,LVS_REPORT);
pListCtl->SetExtendedStyle(LVS_EX_FLATSB
//扁平风格显示滚动条
|LVS_EX_FULLROWSELECT       
//允许整行选中
|LVS_EX_HEADERDRAGDROP    
//允许整列拖动
|LVS_EX_ONECLICKACTIVATE   
//单击选中项
|LVS_EX_GRIDLINES);         
//画出网格线
//设置列标题及列宽
pListCtl->InsertColumn(0,"员工编号",LVCFMT_LEFT,100);
pListCtl->InsertColumn(1,"员工姓名",LVCFMT_LEFT,100);
pListCtl->InsertColumn(2,"文化程度",LVCFMT_LEFT,100);
pListCtl->InsertItem(0,"0001");        //插入第0行
pListCtl->SetItemText(0,1,"赵一");       //向第0行第1列插入数据
pListCtl->SetItemText(0,2,"专科");       //向第0行第2列插入数据
pListCtl->InsertItem(1,"0002");        //插入第1行
pListCtl->SetItemText(1,1,"钱二");       //向第1行第1列插入数据
pListCtl->SetItemText(1,2,"本科");       //向第1行第2列插入数据
pListCtl->InsertItem(2,"0003");        //插入第2行
pListCtl->SetItemText(2,1,"孙三");       //向第2行第1列插入数据
pListCtl->SetItemText(2,2,"研究生");       //向第2行第2列插入数据
}
(4)处理视图类的LVN_BEGINDRAG消息,在该消息的处理函数中开始拖动。代码如下:
void CDragViewView::OnBegindrag(NMHDR* pNMHDR, LRESULT* pResult) 
{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
POINT pt;            //声明POINT对象
m_ItmIndex  = ((NM_LISTVIEW *)pNMHDR)->iItem;   //获得节点索引
int pos=GetListCtrl( ).
GetSelectionMark( );
m_pDrgImg  = GetListCtrl().CreateDragImage(m_ItmIndex,&pt); //创建拖动图像列表
m_pDrgImg->BeginDrag(0,pt);        //开始拖动
m_pDrgImg->DragEnter(this,pt);       //禁止视图更新
m_Drag = TRUE;          //拖动中
*pResult = 0;
}
(5)处理视图类的WM_MOUSEMOVE消息,在该消息的处理函数中随着鼠标的移动位置更新拖动图像的位置。代码如下:
 void CDragViewView::OnMouseMove(UINT nFlags, CPoint point) 
{
if(m_Drag)           //判断是否在拖动中
{
CPoint pt;           //声明Cpoint对象
pt.x = point.x;          //设置拖动图像左上角横坐标
pt.y = point.y + (m_ItmIndex + 1) * 15;     //设置拖动图像左上角纵坐标
m_pDrgImg->DragMove(pt);       //移动拖动图像
}
CListView::OnMouseMove(nFlags, point);
}
(6)处理视图类的WM_LBUTTONUP消息,在该消息的处理函数中结束拖动,并将拖动的数据添加到视图中。代码如下:
void CDragViewView::OnLButtonUp(UINT nFlags, CPoint point) 
{
if(m_Drag)           //判断是否在拖动中
{
m_pDrgImg->EndDrag();        //结束拖动
m_Drag = FALSE;         //设置为不拖动
char name[256];         //声明字符数组
LV_ITEM lvi;          //声明LV_ITEM结构变量
CString subitem[3];         //声明字符串数组
for(int i=2;i>=0;i--)         //循环获得数据
{
ZeroMemory(&lvi,sizeof(LV_ITEM));     //整理内存控件
lvi.iItem  = m_ItmIndex;      //设置行
lvi.iSubItem = i;        //设置列
lvi.mask  = LVIF_IMAGE | LVIF_TEXT;   //标志
lvi.pszText = name;       //列表项内容
lvi.cchTextMax = 255;       //文本最大值
GetListCtrl().GetItem(&lvi);      //获得节点
subitem[i].Format("%s",name);      //设置显示文本
}
GetListCtrl().InsertItem(&lvi);       //插入行
GetListCtrl().SetItemText(m_ItmIndex,1,subitem[1]);   //插入列
GetListCtrl().SetItemText(m_ItmIndex,2,subitem[2]);   //插入列
}
CListView::OnLButtonUp(nFlags, point);
}
实例的运行结果如图7.13所示。
 
图7.13  在视图窗口中实现数据拖动

【责任编辑:夏书 TEL:(010)68476606】

回书目   上一节   下一节

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇7.1.1 构建单文档/视图应用程序 下一篇7.4.3 在子窗口中嵌入控件

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: