⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 selectiondlg.cpp

📁 创建拖放时使用的图标
💻 CPP
字号:

//****************************************************************//
//*                                                              *//
//*   Author  : Hao (David) TRAN                                 *//
//*   Date    : April 17, 2000                                   *//
//*   E-mail  : david.tran@cheetahtech.com                       *//
//*                                                              *//
//****************************************************************//

// SelectionDlg.cpp : implementation file
//

#include "stdafx.h"
#include "DualListDemo.h"
#include "SelectionDlg.h"
#include "ListCtrlSortClass.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CSelectionDlg dialog


CSelectionDlg::CSelectionDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CSelectionDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CSelectionDlg)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
	m_pDragImage = NULL;
	m_pDragWnd = NULL;
}

CSelectionDlg::~CSelectionDlg()
{
	delete m_pDragImage;
	m_pDragImage = NULL;
}

void CSelectionDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CSelectionDlg)
	DDX_Control(pDX, IDC_LIST2, m_list2);
	DDX_Control(pDX, IDC_LIST1, m_list1);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CSelectionDlg, CDialog)
	//{{AFX_MSG_MAP(CSelectionDlg)
	ON_BN_CLICKED(IDC_ADD, OnAdd)
	ON_BN_CLICKED(IDC_REMOVE, OnRemove)
	ON_BN_CLICKED(IDC_ADDALL, OnAddAll)
	ON_BN_CLICKED(IDC_REMOVEALL, OnRemoveAll)
	ON_NOTIFY(NM_DBLCLK, IDC_LIST1, OnDblclkList1)
	ON_NOTIFY(NM_DBLCLK, IDC_LIST2, OnDblclkList2)
	ON_NOTIFY(LVN_BEGINDRAG, IDC_LIST1, OnBegindragList1)
	ON_NOTIFY(LVN_BEGINDRAG, IDC_LIST2, OnBegindragList2)
	ON_WM_MOUSEMOVE()
	ON_WM_LBUTTONUP()
	ON_NOTIFY(LVN_COLUMNCLICK, IDC_LIST1, OnColumnclickList1)
	ON_NOTIFY(LVN_COLUMNCLICK, IDC_LIST2, OnColumnclickList2)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CSelectionDlg message handlers.

BOOL CSelectionDlg::OnInitDialog() 
{
	CDialog::OnInitDialog();
	
	// full row select
	m_list1.SendMessage(LVM_SETEXTENDEDLISTVIEWSTYLE, LVS_EX_FULLROWSELECT, LVS_EX_FULLROWSELECT);
	m_list2.SendMessage(LVM_SETEXTENDEDLISTVIEWSTYLE, LVS_EX_FULLROWSELECT, LVS_EX_FULLROWSELECT);

	// set image list to listctrl
	if ( m_ImageList.Create(16, 16, ILC_COLOR, 0, 4) &&
	     m_ImageList.Add(AfxGetApp()->LoadIcon(IDR_MAINFRAME)) != -1)
	{
		m_list1.SetImageList(&m_ImageList, LVSIL_SMALL);
		m_list2.SetImageList(&m_ImageList, LVSIL_SMALL);
	}

	// create column
	m_list1.InsertColumn(0, "Col 1", LVCFMT_LEFT, 68);
	m_list1.InsertColumn(1, "Col 2", LVCFMT_LEFT, 57);
	m_list1.InsertColumn(2, "Col 3", LVCFMT_LEFT, 57);

	m_list2.InsertColumn(0, "Col 1", LVCFMT_LEFT, 68);
	m_list2.InsertColumn(1, "Col 2", LVCFMT_LEFT, 57);
	m_list2.InsertColumn(2, "Col 3", LVCFMT_LEFT, 57);

	// add some items
	for (int i = 0; i < 500; i++)
	{
		CString str;
		str.Format("(%03d , ", i);
		int n = m_list1.InsertItem(i, str + "01)", 0);
		m_list1.SetItemText(n, 1, str + "02)");
		m_list1.SetItemText(n, 2, str + "03)");
	}

	m_nSortList1Item = -1;
	m_nSortList2Item = -1;

	m_hcArrow = AfxGetApp()->LoadStandardCursor(IDC_ARROW);
	m_hcNo = AfxGetApp()->LoadStandardCursor(IDC_NO);

	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

void CSelectionDlg::OnAdd() 
{
	MoveListItems(m_list1, m_list2);	
}

void CSelectionDlg::OnRemove() 
{
	MoveListItems(m_list2, m_list1);
}

void CSelectionDlg::OnAddAll() 
{
	// Select all then action
	for (int i = 0; i < m_list1.GetItemCount(); i++)
		m_list1.SetItemState(i, LVIS_SELECTED, LVIS_SELECTED);

	OnAdd();
}

void CSelectionDlg::OnRemoveAll() 
{
	// Select all then action
	for (int i = 0; i < m_list2.GetItemCount(); i++)
		m_list2.SetItemState(i, LVIS_SELECTED, LVIS_SELECTED);

	OnRemove();
}

void CSelectionDlg::OnDblclkList1(NMHDR* pNMHDR, LRESULT* pResult) 
{
	OnAdd();
	*pResult = 0;
}

void CSelectionDlg::OnDblclkList2(NMHDR* pNMHDR, LRESULT* pResult) 
{
	OnRemove();
	*pResult = 0;
}

void CSelectionDlg::MoveListItems(CListCtrl & pFromList, CListCtrl & pToList)
{
	if (pFromList.GetSelectedCount() <= 0)
		return; // no row selected to move

	// Unselect row at pToList
	int k = -1;
	while ((k = pToList.GetNextItem(k, LVNI_SELECTED)) != -1)
	{
		pToList.SetItemState(k, 0, LVIS_SELECTED);
	}

	// Move items (delete from pFromList and copy to pToList) And select items move
	int n = 0;
	while ((k = pFromList.GetNextItem(-1, LVNI_SELECTED)) != -1)
	{
		n = pToList.InsertItem(0, pFromList.GetItemText(k, 0));
		pToList.SetItemText(n, 1, pFromList.GetItemText(k, 1));
		pToList.SetItemText(n, 2, pFromList.GetItemText(k, 2));
		pToList.SetItemState(n, LVIS_SELECTED, LVIS_SELECTED);
		pFromList.DeleteItem(k);
		n++;
	}

	pToList.EnsureVisible(0, TRUE);
	pToList.SetFocus();
}

void CSelectionDlg::OnBegindragList1(NMHDR* pNMHDR, LRESULT* pResult) 
{
	TRACE("asdfasd");
	OnBegindrag(&m_list1, pNMHDR);
	*pResult = 0;
}

void CSelectionDlg::OnBegindragList2(NMHDR* pNMHDR, LRESULT* pResult) 
{
	OnBegindrag(&m_list2, pNMHDR);
	*pResult = 0;
}

void CSelectionDlg::OnBegindrag(CListCtrl* pList, NMHDR* pNMHDR) 
{
	NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;

	if (pList->GetSelectedCount() <= 0)
		return;  // No row selected

	POINT pt;

 	m_pDragImage = CreateDragImageEx(pList, &pt);

	if (m_pDragImage == NULL)
		return;

	m_pDragWnd = pList;
	CPoint ptStart = pNMListView->ptAction;
	ptStart -= pt;
	m_pDragImage->BeginDrag(0, ptStart);
	m_pDragImage->DragEnter(GetDesktopWindow(), pNMListView->ptAction);
	SetCapture();
}

void CSelectionDlg::OnMouseMove(UINT nFlags, CPoint point) 
{
	if (m_pDragImage && m_pDragWnd) // In Drag&Drop mode ?
	{
		CPoint ptDropPoint(point);
		ClientToScreen(&ptDropPoint);
		m_pDragImage->DragMove(ptDropPoint);
		CWnd* pDropWnd = CWnd::WindowFromPoint(ptDropPoint);
		SetCursor (((pDropWnd == &m_list1) || (pDropWnd == &m_list2)) ? m_hcArrow : m_hcNo);
	}
	
	CDialog::OnMouseMove(nFlags, point);
}

void CSelectionDlg::OnLButtonUp(UINT nFlags, CPoint point) 
{
	if (m_pDragImage && m_pDragWnd) // In Drag&Drop mode ?
	{
		::ReleaseCapture();
		m_pDragImage->DragLeave(GetDesktopWindow());
		m_pDragImage->EndDrag();
		
		CPoint pt(point);
		ClientToScreen(&pt);
	 	CWnd* m_pDropWnd = WindowFromPoint(pt);
		
		if ((m_pDragWnd == &m_list1) && (m_pDropWnd == &m_list2))
			OnAdd();
		else if ((m_pDragWnd == &m_list2) && (m_pDropWnd == &m_list1))
			OnRemove();

		m_pDragImage->DeleteImageList();
		delete m_pDragImage;
		m_pDragImage = NULL;
		m_pDragWnd = NULL;
	}
	
	CDialog::OnLButtonUp(nFlags, point);
}

CImageList* CSelectionDlg::CreateDragImageEx(CListCtrl *pList, LPPOINT lpPoint)
{
	if (pList->GetSelectedCount() <= 0)
		return NULL; // no row selected

	CRect rectSingle;
	CRect rectComplete(0,0,0,0);

	// Determine List Control Client width size
	pList->GetClientRect(rectSingle);
	int nWidth  = rectSingle.Width();

	// Start and Stop index in view area
	int nIndex = pList->GetTopIndex() - 1;
	int nBottomIndex = pList->GetTopIndex() + pList->GetCountPerPage() - 1;
	if (nBottomIndex > (pList->GetItemCount() - 1))
		nBottomIndex = pList->GetItemCount() - 1;

	// Determine the size of the drag image (limite for rows visibled and Client width)
	while ((nIndex = pList->GetNextItem(nIndex, LVNI_SELECTED)) != -1)
	{
		if (nIndex > nBottomIndex)
			break; 

		pList->GetItemRect(nIndex, rectSingle, LVIR_BOUNDS);

		if (rectSingle.left < 0) 
			rectSingle.left = 0;

		if (rectSingle.right > nWidth)
			rectSingle.right = nWidth;

		rectComplete.UnionRect(rectComplete, rectSingle);
	}
		
	CClientDC dcClient(this);
	CDC dcMem;
	CBitmap Bitmap;

	if (!dcMem.CreateCompatibleDC(&dcClient))
		return NULL;

	if (!Bitmap.CreateCompatibleBitmap(&dcClient, rectComplete.Width(), rectComplete.Height()))
		return NULL;

	CBitmap *pOldMemDCBitmap = dcMem.SelectObject(&Bitmap);
	// Use green as mask color
 	dcMem.FillSolidRect(0, 0, rectComplete.Width(), rectComplete.Height(), RGB(0,255,0));

	// Paint each DragImage in the DC
	nIndex = pList->GetTopIndex() - 1;
	while ((nIndex = pList->GetNextItem(nIndex, LVNI_SELECTED)) != -1)
	{	
		if (nIndex > nBottomIndex)
			break;

		CPoint pt;
		CImageList* pSingleImageList = pList->CreateDragImage(nIndex, &pt);

		if (pSingleImageList)
		{
			pList->GetItemRect(nIndex, rectSingle, LVIR_BOUNDS);
			pSingleImageList->Draw( &dcMem, 
									0, 
									CPoint(rectSingle.left - rectComplete.left, 
									       rectSingle.top - rectComplete.top), 
									ILD_MASK);
			pSingleImageList->DeleteImageList();
			delete pSingleImageList;
		}
	}

 	dcMem.SelectObject(pOldMemDCBitmap);
	CImageList* pCompleteImageList = new CImageList;
	pCompleteImageList->Create(rectComplete.Width(), rectComplete.Height(), ILC_COLOR | ILC_MASK, 0, 1);
	pCompleteImageList->Add(&Bitmap, RGB(0, 255, 0)); // Green is used as mask color
	Bitmap.DeleteObject();

	if (lpPoint)
	{
		lpPoint->x = rectComplete.left;
		lpPoint->y = rectComplete.top;
	}

	return pCompleteImageList;
}


void CSelectionDlg::OnColumnclickList1(NMHDR* pNMHDR, LRESULT* pResult) 
{
	NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;

	if (pNMListView->iSubItem == m_nSortList1Item)
	{
		m_bSortList1Asc = !m_bSortList1Asc;
	}
	else
	{
		m_nSortList1Item = pNMListView->iSubItem;
		m_bSortList1Asc = TRUE;
	}

	// Sort list
	CListCtrlSortClass sc(&m_list1, m_nSortList1Item);
	sc.Sort(m_bSortList1Asc, CListCtrlSortClass::SortDataType::dtSTRING);

	*pResult = 0;
}

void CSelectionDlg::OnColumnclickList2(NMHDR* pNMHDR, LRESULT* pResult) 
{
	NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;

	if (pNMListView->iSubItem == m_nSortList2Item)
	{
		m_bSortList2Asc = !m_bSortList2Asc;
	}
	else
	{
		m_nSortList2Item = pNMListView->iSubItem;
		m_bSortList2Asc = TRUE;
	}

	// Sort list
	CListCtrlSortClass sc(&m_list2, m_nSortList2Item);
	sc.Sort(m_bSortList2Asc, CListCtrlSortClass::SortDataType::dtSTRING);

	*pResult = 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -