Оригинальный DVD-ROM: eXeL@B DVD !
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
выпущен 8 мая!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

ПРОГРАММИРОВАНИЕ НА C и С++



Давно заметил, что всё-таки языки С/C++ это не самый лучший вариант программирования под Windows. Сейчас появилась масса более современных и удобных языков, например тот же Python - кроссплатформенный язык, очень легок в изучение. Я его изучил буквально за несколько дней по этому курсу - ссылка. Автор постарался, там видеоуроки на удивление легкие и понятные.

Реализация drag'n'drop в CTreeView

Автор этой статьи не балует нас комментариями и объяснениями на данную тему:"Все, что Вам нужно сделать - это добавить приведенные файлы к своему проекту!" Дешево и сердито.

Файл объявления:


 #if !defined(AFX_TREEVIEWEXT_H__99D8F6F8_79F0_11D1_8DC6_0000E8125FE5__INCLUDED_)
 #define AFX_TREEVIEWEXT_H__99D8F6F8_79F0_11D1_8DC6_0000E8125FE5__INCLUDED_
 
 #if _MSC_VER >= 1000
 #pragma once
 #endif // _MSC_VER >= 1000
 // TreeViewExt.h : header file
 //
 
 //////////////////////////////////////////
 // CTreeViewExt view
 
 class CTreeViewExt : public CTreeView
 {
 protected:
 	CTreeViewExt();
 	DECLARE_DYNCREATE(CTreeViewExt)
 
 // Attributes
 public:
 
 // Operations
 public:
 
 // Overrides
 	// ClassWizard generated virtual function overrides
 	//{{AFX_VIRTUAL(CTreeViewExt)
 	protected:
 	virtual void OnDraw(CDC* pDC);      // перегружено для рисования этого элемента
 	//}}AFX_VIRTUAL
 
 // Implementation
 protected:
 	HTREEITEM m_hDraggedItem;
 	BOOL m_bDraggingNow;
 	CImageList *m_pDragImageList;
 	virtual ~CTreeViewExt();
 #ifdef _DEBUG
 	virtual void AssertValid() const;
 	virtual void Dump(CDumpContext& dc) const;
 #endif
 
 	// Generated message map functions
 protected:
 	virtual void CopyItemProperties(HTREEITEM hNewItem, HTREEITEM hDraggedItem);
 	virtual BOOL IsItemCanBeDroppedOn(HTREEITEM hSource, HTREEITEM hTarget);
 	virtual BOOL ItemCanBeDragged(HTREEITEM hItem);
 	//{{AFX_MSG(CTreeViewExt)
 	afx_msg void OnBegindrag(NMHDR* pNMHDR, LRESULT* pResult);
 	afx_msg void OnMouseMove(UINT nFlags, CPoint point);
 	afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
 	//}}AFX_MSG
 	DECLARE_MESSAGE_MAP()
 };
 
 //////////////////////////////////////////
 //{{AFX_INSERT_LOCATION}}
 
 #endif // !defined(AFX_TREEVIEWEXT_H__99D8F6F8_79F0_11D1_8DC6_0000E8125FE5__INCLUDED_)
        

Файл реализации:


 // TreeViewExt.cpp : implementation file
 //
 
 #include "stdafx.h"
 #include "TreeViewExt.h"
 
 #ifdef _DEBUG
 #define new DEBUG_NEW
 #undef THIS_FILE
 static char THIS_FILE[] = __FILE__;
 #endif
 
 //////////////////////////////////////
 // CTreeViewExt
 
 IMPLEMENT_DYNCREATE(CTreeViewExt, CTreeView)
 
 CTreeViewExt::CTreeViewExt()
 {
 	m_bDraggingNow		= FALSE;
 	m_hDraggedItem		= NULL;
 	m_pDragImageList	= NULL;
 }
 
 CTreeViewExt::~CTreeViewExt()
 {
 }
 
 
 BEGIN_MESSAGE_MAP(CTreeViewExt, CTreeView)
 	//{{AFX_MSG_MAP(CTreeViewExt)
 	ON_NOTIFY_REFLECT(TVN_BEGINDRAG, OnBegindrag)
 	ON_WM_MOUSEMOVE()
 	ON_WM_LBUTTONUP()
 	//}}AFX_MSG_MAP
 END_MESSAGE_MAP()
 
 ///////////////////////////////////////////
 // CTreeViewExt drawing
 
 void CTreeViewExt::OnDraw(CDC* pDC)
 {
 	CDocument* pDoc = GetDocument();
 	// TODO: add draw code here
 }
 
 ////////////////////////////////////////////
 // CTreeViewExt diagnostics
 
 #ifdef _DEBUG
 void CTreeViewExt::AssertValid() const
 {
 	CTreeView::AssertValid();
 }
 
 void CTreeViewExt::Dump(CDumpContext& dc) const
 {
 	CTreeView::Dump(dc);
 }
 #endif //_DEBUG
 
 ///////////////////////////////////////////////
 // CTreeViewExt message handlers
 
 void CTreeViewExt::OnBegindrag(NMHDR* pNMHDR, LRESULT* pResult)
 {
 	NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
 
 	if (!m_bDraggingNow)
 	{
 		if (ItemCanBeDragged(pNMTreeView->itemNew.hItem))
 		{
 			CTreeCtrl& tree = GetTreeCtrl();
 			tree.SetCapture();
 			m_bDraggingNow = TRUE;
 			m_hDraggedItem = pNMTreeView->itemNew.hItem;
 			tree.Select(m_hDraggedItem, TVGN_CARET);
 			m_pDragImageList = tree.CreateDragImage(m_hDraggedItem);
 			m_pDragImageList->DragEnter(&tree, pNMTreeView->ptDrag);
 			m_pDragImageList->BeginDrag(0, CPoint(0, 0));
 		}
 	}
 
 	*pResult = 0;
 }
 
 void CTreeViewExt::OnMouseMove(UINT nFlags, CPoint point)
 {
 	if (m_bDraggingNow)
 	{
 		CTreeCtrl& tree = GetTreeCtrl();
 		m_pDragImageList->DragEnter(&tree, point);
 		m_pDragImageList->DragMove(point);
 	}
 
 	CTreeView::OnMouseMove(nFlags, point);
 }
 
 void CTreeViewExt::OnLButtonUp(UINT nFlags, CPoint point)
 {
 	if (m_bDraggingNow)
 	{
 		ReleaseCapture();
 
 		m_bDraggingNow = FALSE;
 		m_pDragImageList->EndDrag();
 		delete m_pDragImageList;
 		m_pDragImageList = NULL;
 
 		CTreeCtrl& tree = GetTreeCtrl();
 		UINT flags;
 		HTREEITEM hTargetItem = tree.HitTest(point, &flags);
 		if (hTargetItem != NULL && IsItemCanBeDroppedOn(m_hDraggedItem, hTargetItem))
 		{
 			HTREEITEM hNewItem = tree.InsertItem("Untitled", hTargetItem);
 			CopyItemProperties(hNewItem, m_hDraggedItem);
 			if (nFlags != MK_CONTROL)
 				tree.DeleteItem(m_hDraggedItem);
 		}
 
 		m_hDraggedItem = NULL;
 	}
 
 	CTreeView::OnLButtonUp(nFlags, point);
 }
 
 BOOL CTreeViewExt::ItemCanBeDragged(HTREEITEM hItem)
 {
 	return FALSE;
 }
 
 BOOL CTreeViewExt::IsItemCanBeDroppedOn(HTREEITEM hSource, HTREEITEM hTarget)
 {
 	return FALSE;
 }
 
 void CTreeViewExt::CopyItemProperties(HTREEITEM hNewItem, HTREEITEM hDraggedItem)
 {
 
 }
 

 

Источник: ProtoSphere



<< ВЕРНУТЬСЯ В ПОДРАЗДЕЛ

<< ВЕРНУТЬСЯ В ОГЛАВЛЕНИЕ




Материалы находятся на сайте https://exelab.ru/pro/



Оригинальный DVD-ROM: eXeL@B DVD !


Вы находитесь на EXELAB.rU
Проект ReactOS