【VC开源代码栏目提醒】:本文主要为网学会员提供DRAGVIEW.CPP,希望对需要DRAGVIEW.CPP网友有所帮助,学习一下!
// dragView.cpp : implementation of the CDragView class
//
#include "stdafx.h"
#include "drag.h"
#include "dragDoc.h"
#include "dragView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CDragView
IMPLEMENT_DYNCREATE(CDragView, CTreeView)
BEGIN_MESSAGE_MAP(CDragView, CTreeView)
//{{AFX_MSG_MAP(CDragView)
ON_NOTIFY_REFLECT(TVN_BEGINDRAG, OnBeginDrag)
ON_WM_LBUTTONUP()
ON_WM_MOUSEMOVE()
ON_WM_DESTROY()
ON_WM_TIMER()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CDragView construction/destruction
CDragView::CDragView()
: m_pDragImage(NULL),
m_htiDrag(NULL),
m_htiDrop(NULL),
m_htiOldDrop(NULL),
m_bLDragging(false),
m_idTimer(0)
{
}
CDragView::~CDragView()
{
}
BOOL CDragView::PreCreateWindow(CREATESTRUCT& cs)
{
if( CTreeView::PreCreateWindow(cs) == FALSE )
return FALSE;
cs.style |= TVS_HASLINES|TVS_HASBUTTONS|TVS_LINESATROOT;
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
// CDragView drawing
void CDragView::OnDraw(CDC* pDC)
{
CDragDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
}
void CDragView::OnInitialUpdate()
{
CTreeView::OnInitialUpdate();
CTreeCtrl& theTree = GetTreeCtrl();
CImageList* pImage = new CImageList;
pImage->Create( IDR_IMAGE, 16, 1, ::GetSysColor(COLOR_WINDOW) );
theTree.SetImageList( pImage, TVSIL_NORMAL );
TVINSERTSTRUCT insert;
::ZeroMemory( &insert, sizeof(TVINSERTSTRUCT) );
TVITEM item;
::ZeroMemory( &item, sizeof(TVITEM) );
item.mask = TVIF_IMAGE|TVIF_TEXT;
item.pszText = "Root Item";
item.iImage = 0;
insert.hParent = TVI_ROOT;
insert.hInsertAfter = TVI_LAST;
::CopyMemory( &(insert.item), &item, sizeof(TVITEM) );
HTREEITEM hParent = theTree.InsertItem( &insert );
item.pszText = "Branch";
insert.hParent = hParent;
::CopyMemory( &(insert.item), &item, sizeof(TVITEM) );
for( int i = 0; i < 10; i++ )
theTree.InsertItem( &insert );
item.mask = TVIF_IMAGE|TVIF_TEXT;
item.pszText = "Root Item";
item.iImage = 0;
insert.hParent = TVI_ROOT;
insert.hInsertAfter = TVI_LAST;
::CopyMemory( &(insert.item), &item, sizeof(TVITEM) );
hParent = theTree.InsertItem( &insert );
item.pszText = "Branch";
insert.hParent = hParent;
::CopyMemory( &(insert.item), &item, sizeof(TVITEM) );
for( i = 0; i < 10; i++ )
theTree.InsertItem( &insert );
}
/////////////////////////////////////////////////////////////////////////////
// CDragView diagnostics
#ifdef _DEBUG
void CDragView::AssertValid() const
{
CTreeView::AssertValid();
}
void CDragView::Dump(CDumpContext& dc) const
{
CTreeView::Dump(dc);
}
CDragDoc* CDragView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CDragDoc)));
return (CDragDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CDragView message handlers
void CDragView::OnBeginDrag(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
m_htiDrag = pNMTreeView->itemNew.hItem;
m_htiDrop = NULL;
m_pDragImage = GetTreeCtrl().CreateDragImage( m_htiDrag );
if( !m_pDragImage )
return;
m_bLDragging = true;
CPoint pt(0,0);
IMAGEINFO ii;
m_pDragImage->GetImageInfo( 0, &ii );
pt.x = (ii.rcImage.right - ii.rc