CListCtrl에서 Drag & Drop 구현

.h
CImageList* m_pImgListDrag;

.cpp
void CDragDemoDlg::OnLvnBegindragListLeft(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMLISTVIEW pNMLV = reinterpret_cast(pNMHDR);

// ptDrag : 드래그하는 항목의 ListCtrl 기준 좌표
CPoint ptDrag, ptAction;
m_nIndexLeftSel = pNMLV->iItem;
m_pImgListDrag = m_List_Left.CreateDragImage(pNMLV->iItem, &ptDrag);
m_pImgListDrag->SetBkColor(RGB(0, 0, 0));
ptAction = pNMLV->ptAction;

SetCapture();
m_pImgListDrag->BeginDrag(0, ptAction - ptDrag);
m_List_Left.ClientToScreen(&ptAction);
m_pImgListDrag->DragEnter(NULL, ptAction);//드래그 상태

*pResult = 0;
}

void CDragDemoDlg::OnMouseMove(UINT nFlags, CPoint point)
{
if(m_pImgListDrag != NULL)
{
ClientToScreen(&point);

CWnd* pWnd = CWnd::WindowFromPoint(point);
if(pWnd != NULL)
{
if(this == pWnd || IsChild(pWnd))
{
m_pImgListDrag->DragEnter(NULL, point);//지워진 드래그 이미지를 화면에 다시 나오게 함
m_pImgListDrag->DragMove(point);//드래그 이미지 출력
}
else
{
m_pImgListDrag->DragLeave(NULL);//드래그 이미지를 화면에서 지운다.
}
}
}

CDialog::OnMouseMove(nFlags, point);
}

void CDragDemoDlg::OnLButtonUp(UINT nFlags, CPoint point)
{
CString strTmp = _T("");
if(m_pImgListDrag != NULL)
{
ClientToScreen(&point);

m_pImgListDrag->DragLeave(NULL);
m_pImgListDrag->EndDrag();
ReleaseCapture();

//오른쪽 리스트에 아이템 추가.
CWnd* pWnd = CWnd::WindowFromPoint(point);
if(pWnd == &m_List_Right && m_nIndexLeftSel >= 0)
{
LVITEM lvItem;
TCHAR szBuffer[256];
::ZeroMemory(&lvItem, sizeof(lvItem));
::ZeroMemory(szBuffer, sizeof(256));

lvItem.mask = LVIF_TEXT | LVIF_IMAGE;
lvItem.iItem = m_nIndexLeftSel;
lvItem.pszText = szBuffer;
lvItem.cchTextMax = 256;
m_List_Left.GetItem(&lvItem);

m_List_Right.InsertItem(0, lvItem.pszText, lvItem.iImage);
}

//왼쪽 리스트이면 구체적인 아이템 인덱스 출력.
else
{
m_List_Left.ScreenToClient(&point);
int nIndex = m_List_Left.HitTest(point);
if(nIndex >= 0)
{
strTmp.Format(_T("Drop on %dth item"), nIndex);
AfxMessageBox(strTmp);
}
}

delete m_pImgListDrag;
m_pImgListDrag = NULL;
m_nIndexLeftSel = -1;
}

CDialog::OnLButtonUp(nFlags, point);
}

Related Posts

답글 남기기

이메일 주소는 공개되지 않습니다.