Files
coco df489d5640 a
2026-07-03 16:05:30 +08:00

260 lines
5.7 KiB
C++

#include "CDragListCtrl.h"
// BEGIN_MESSAGE_MAP(CDragListCtrl, CListCtrl)
// ON_NOTIFY(LVN_BEGINDRAG, IDC_LIST_LOOP_SUB_LIST, &CDragListCtrl::OnLvnBegindragListLoopTaskList)
// ON_MESSAGE(WM_MOUSEMOVE, OnMouseMove)
// ON_MESSAGE(WM_LBUTTONUP, OnLButtonUp)
// END_MESSAGE_MAP()
CDragListCtrl::CDragListCtrl()
{
m_nSelItem = -1;
m_pDragImageList = NULL;
m_bDragging = FALSE;
}
CDragListCtrl::~CDragListCtrl()
{
}
/*void CDragListCtrl::OnLvnBegindrag(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
// TODO: 在此添加控件通知处理程序代码
*pResult = 0;
int count = GetSelectedCount();
if (1 != count)
return;
POSITION pos = GetFirstSelectedItemPosition();
if (NULL == pos)
return;
m_nSelItem = GetNextSelectedItem(pos);
if (-1 == m_nSelItem)
return;
CPoint pt = pNMLV->ptAction;
m_pDragImageList = CreateDragImage(m_nSelItem, &pt);
if (NULL == m_pDragImageList)
return;
m_bDragging = TRUE;
m_pDragImageList->BeginDrag(0, CPoint(8, 8));
ClientToScreen(&pt);
CRect rt;
GetParent()->GetWindowRect(&rt);
pt.x -= rt.left;
pt.y -= rt.top;
m_pDragImageList->DragEnter(GetParent(), pt);
SetCapture();
}
void CDragListCtrl::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
if (m_bDragging)
{
ReleaseCapture();
m_bDragging = FALSE;
//m_nSelItem = -1;
m_pDragImageList->DragLeave(GetParent());
m_pDragImageList->EndDrag();
m_pDragImageList->DeleteImageList();
delete m_pDragImageList;
m_pDragImageList = NULL;
}
CListCtrl::OnLButtonUp(nFlags, point);
}
void CDragListCtrl::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
if (m_bDragging)
{
CPoint pt = point;
ClientToScreen(&pt);
CRect rt;
GetParent()->GetWindowRect(&rt);
pt.x -= rt.left;
pt.y -= rt.top;
m_pDragImageList->DragMove(pt);
}
CListCtrl::OnMouseMove(nFlags, point);
}*/
BEGIN_MESSAGE_MAP(CDragListCtrl, CListCtrl)
ON_NOTIFY_REFLECT(LVN_BEGINDRAG, &CDragListCtrl::OnLvnBegindrag)
ON_WM_LBUTTONUP()
ON_WM_MOUSEMOVE()
//ON_WM_LBUTTONDOWN()
END_MESSAGE_MAP()
void CDragListCtrl::OnLvnBegindrag(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
// TODO: 在此添加控件通知处理程序代码
*pResult = 0;
int count = GetSelectedCount();
if (1 != count)
return;
POSITION pos = GetFirstSelectedItemPosition();
if (NULL == pos)
return;
m_nSelItem = GetNextSelectedItem(pos);
if (-1 == m_nSelItem)
return;
CPoint pt = pNMLV->ptAction;
m_pDragImageList = CreateDragImage(m_nSelItem, &pt);
if (NULL == m_pDragImageList)
return;
m_bDragging = TRUE;
m_pDragImageList->BeginDrag(0, CPoint(8, 8));
ClientToScreen(&pt);
CRect rt;
GetParent()->GetWindowRect(&rt);
pt.x -= rt.left;
pt.y -= rt.top;
m_pDragImageList->DragEnter(GetParent(), pt);
CDragList::BeginDrag(m_hWnd, pt);
SetCapture();
}
void CDragListCtrl::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
if (m_bDragging)
{
CPoint pt = point;
ClientToScreen(&pt);
CRect rt;
GetParent()->GetWindowRect(&rt);
pt.x -= rt.left;
pt.y -= rt.top;
m_pDragImageList->DragMove(pt);
}
if (CDragList::m_SelectItem != SELECT_NONE && nFlags&MK_LBUTTON)
{
CDragList::Dragging(m_hWnd, point);
}
CListCtrl::OnMouseMove(nFlags, point);
}
void CDragListCtrl::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
if (m_bDragging)
{
ReleaseCapture();
m_bDragging = FALSE;
//m_nSelItem = -1;
m_pDragImageList->DragLeave(GetParent());
m_pDragImageList->EndDrag();
m_pDragImageList->DeleteImageList();
delete m_pDragImageList;
m_pDragImageList = NULL;
}
CDragList::EndDrag(m_hWnd, point);
CListCtrl::OnLButtonUp(nFlags, point);
}
/*void CDragListCtrl::OnLvnBegindrag(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
// TODO: 在此添加控件通知处理程序代码
*pResult = 0;
int count = GetSelectedCount();
if (1 != count)
return;
POSITION pos = GetFirstSelectedItemPosition();
if (NULL == pos)
return;
m_nSelItem = GetNextSelectedItem(pos);
if (-1 == m_nSelItem)
return;
CPoint pt = pNMLV->ptAction;
m_pDragImageList = CreateDragImage(m_nSelItem, &pt);
if (NULL == m_pDragImageList)
return;
m_bDragging = TRUE;
m_pDragImageList->BeginDrag(0, CPoint(8, 8));
ClientToScreen(&pt);
CRect rt;
GetParent()->GetWindowRect(&rt);
pt.x -= rt.left;
pt.y -= rt.top;
m_pDragImageList->DragEnter(GetParent(), pt);
SetCapture();
}
void CDragListCtrl::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
if (m_bDragging)
{
CPoint pt = point;
ClientToScreen(&pt);
CRect rt;
GetParent()->GetWindowRect(&rt);
pt.x -= rt.left;
pt.y -= rt.top;
m_pDragImageList->DragMove(pt);
}
CListCtrl::OnMouseMove(nFlags, point);
}
void CDragListCtrl::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
if (m_bDragging)
{
ReleaseCapture();
m_bDragging = FALSE;
//m_nSelItem = -1;
m_pDragImageList->DragLeave(GetParent());
m_pDragImageList->EndDrag();
m_pDragImageList->DeleteImageList();
delete m_pDragImageList;
m_pDragImageList = NULL;
}
CListCtrl::OnLButtonUp(nFlags, point);
}*/
// void CDragListCtrl::OnLButtonDown(UINT nFlags, CPoint point)
// {
// // TODO: 在此添加消息处理程序代码和/或调用默认值
//
// CListCtrl::OnLButtonDown(nFlags, point);
// CDragList::BeginDrag(m_hWnd, point);
// OutputDebugString(_T("CDragListCtrl::OnLButtonDown()\n"));
// }