관리 메뉴

HeBhy, since 1983.

[VC] 트리뷰 드래그앤 드랍 처리하기 (treeview drag & drop) 본문

Dev/Dev basics

[VC] 트리뷰 드래그앤 드랍 처리하기 (treeview drag & drop)

HeBhy 2009. 7. 18. 22:45

데브피아 어느분이 올리셨던 소스를 조금 손봤는데 거의 동일합니다.
다만, goto를 없앤거, 이미지처리 및 클래스 상속없이 헤더파일만 포함하면
어떤 다이얼로그에서도 동일한 처리가 가능하도록 했습니다. 편의성 위주죠..
사용하고자 하는 dlg cpp 파일에 CTV.h 를 인클루드 하시고, 다이얼로그에서 TVN_BEGINDRAG 메세지 추가해주시고 안에 다음처럼 집어넣으시면 됩니다. (예제 -  m_TreeMesh 는 CTreeCtrl의 컨트롤 변수입니다)

이해안되시는것 있으면 댓글 달아주세요 ^^




void CDlgTabMesh::OnTvnBegindragTreeMesh(NMHDR *pNMHDR, LRESULT *pResult)
{
    LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);
    // TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
    HTREEITEM hDragItem = pNMTreeView->itemNew.hItem;

    HTREEITEM hDropTargetItem = CTV::DragItem(&m_TreeMesh, hDragItem, pNMTreeView->ptDrag);
    if(hDropTargetItem != NULL) {
        HTREEITEM hItem = CTV::CopyItem(&m_TreeMesh, hDragItem, hDropTargetItem);  // 복사. 차일드까지.

        if(hItem != NULL) {
            m_TreeMesh.SelectItem(hItem);    // 새 아이템 선택
            CTV::DeleteItem(&m_TreeMesh, hDragItem);    // 기존것 삭제.(차일드까지)
        }
    }


    *pResult = 0;
}

아래는 CTV.h 소스입니다. 선언부.

#pragma once

#include "resource.h"
#include "afxcmn.h"
#include "afxwin.h"

#define ID_TIMER_AUTOEXPAND     1000        // 오토 익스팬드를 위한 타이머 ID이자 시간
#define ID_TIMER_AUTOSCROLL     50            // 오토 스크롤을 위한 타이머 ID이자 시간

typedef class CTV {

public:
    static HTREEITEM    DragItem(CTreeCtrl* pTree, HTREEITEM hDragItem, CPoint point);
    static HTREEITEM    CopyItem(CTreeCtrl* pTree, HTREEITEM hSrc, HTREEITEM hDestParent = TVI_ROOT, HTREEITEM hCopyAfter = TVI_LAST);
    static void        DeleteItem(CTreeCtrl* pTree, HTREEITEM hItem);
} *PCTV, **LPCTV;



아래는 CTV.cpp 입니다. 정의부.

Comments