.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);
}