📄 selectiondlg.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 + -