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