AutoCAD 3DMAX C语言 Pro/E UG JAVA编程 PHP编程 Maya动画 Matlab应用 Android
Photoshop Word Excel flash VB编程 VC编程 Coreldraw SolidWorks A Designer Unity3D
 首页 > VC编程

在切分窗口之间实现拖放

51自学网 2015-08-30 http://www.wanshiok.com

  现在到目录树视了:

  为了能访问需要的成员变量,我们还是先定义了一个帮助函数从而可以轻易的访问我们的app类:

CMyApp *CMyTreeView::GetApp()
{
 return ( (CMyApp*)AfxGetApp() );
}

  三个消息处理函数:

ON_WM_LBUTTONUP()
ON_WM_MOUSEMOVE()
ON_NOTIFY_REFLECT(LVN_BEGINDRAG, OnBegindrag)

  把这个视所能设置的元素都设成是开始拖的状态,而目的视也许是本身,或是别的视。

void CMyTreeView::OnBegindrag(NMHDR* pNMHDR, LRESULT* pResult)
{
 NM_TREEVIEW *pTreeView = (NM_TREEVIEW*)pNMHDR;

 *pResult = 0;

 //获得指向树型控件的指针:
 CTreeCtrl &cTree = GetTreeCtrl();

 GetApp()->cTreeItemDrag = pTreeView->itemNew.hItem;
 GetApp()->cTreeItemDrop = NULL;

 //建立一个被拖的条目的图象:
 GetApp()->cpDragImage = cTree.CreateDragImage(GetApp()->cTreeItemDrag);
 GetApp()->cpDragImage->BeginDrag(0, CPoint(-15,-15));
 POINT pt = pTreeView->ptDrag;
 ClientToScreen( &pt );
 GetApp()->cpDragImage->DragEnter(NULL, pt);

 //初始化:
 GetApp()->cDragging = TRUE;
 GetApp()->cpDragWnd = &cTree;
 GetApp()->cpDropWnd = NULL;
 }

void CMyTreeView::OnMouseMove(UINT nFlags, CPoint point)
{
 HTREEITEM hitem;
 UINT flags;

 //获得指向树型控件的指针:
 CTreeCtrl &cTree = GetTreeCtrl();

 //如果是正在被拖动的话:
 if ( GetApp()->cDragging )
 {
  POINT pt = point;
  ClientToScreen( &pt );

  //移动图象:
  GetApp()->cpDragImage->DragMove(pt);
 
  if ( (hitem = cTree.HitTest(point, &flags)) != NULL )
  {
   GetApp()->cpDragImage->DragShowNolock(FALSE);
   cTree.SelectDropTarget(hitem);
   GetApp()->cTreeItemDrop = hitem;
   GetApp()->cpDragImage->DragShowNolock(TRUE);
  }
 }

 CTreeView::OnMouseMove(nFlags, point);
}

void CMyTreeView::OnLButtonUp(UINT nFlags, CPoint point)
{
 //获得指向树型控件的指针:
 CTreeCtrl &cTree = GetTreeCtrl();

 CTreeView::OnLButtonUp(nFlags, point);

 //I如果是正在被拖动的话:
 if ( GetApp()->cDragging )
 {
  //不再拖动了:
  GetApp()->cDragging = FALSE;
  GetApp()->cpDragImage->DragLeave(this);
  GetApp()->cpDragImage->EndDrag();
  delete GetApp()->cpDragImage;

  cTree.SelectDropTarget(NULL);

  //验证被拖动的图象已被放下:
  GetApp()->cDropPoint = point;
  ClientToScreen(&GetApp()->cDropPoint);
  GetApp()->cpDropWnd = WindowFromPoint(GetApp()->cDropPoint);

  //选择拖动目的资源的类型:
  if ( GetApp()->cpDragWnd->IsKindOf(RUNTIME_CLASS(CListView)) )
  {
   AfxMessageBox("source is list view", MB_OK);
  }
  else
   if ( GetApp()->cpDragWnd->IsKindOf(RUNTIME_CLASS(CTreeView)) )
   {
    AfxMessageBox("source is treeview", MB_OK);
   }
   else
    AfxMessageBox("source is something else", MB_OK);
 }
}

 
 
说明
:本教程来源互联网或网友上传或出版商,仅为学习研究或媒体推广,wanshiok.com不保证资料的完整性。

上一篇:用VC++制作一个简单的局域网消息发送工程  下一篇:理解VC工程