CListCtrl에서 Drag & Drop 구현 DarkKaiser, 2010년 5월 18일2023년 9월 5일 .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); } C/C++/VC++