//上移
void CBOrderColorDLg::OnBnClickedMoveUp()
{
SetFocus();
int iCurIndex = m_iColorIndex;//当前行索引
int iPreIndex = iCurIndex - 1; //上一行索引
if(iPreIndex < 0)
return;
exchangeData(iCurIndex, iPreIndex);
m_iColorIndex = iPreIndex;
}
//下移
void CBOrderColorDLg::OnBnClickedMoveDown()
{
SetFocus();
int iCurIndex = m_iColorIndex;//当前行索引
int iNextIndex = iCurIndex + 1; //下一行索引
if(iNextIndex >= m_pOrderColorList->GetItemCount())
return;
exchangeData(iCurIndex, iNextIndex);
m_iColorIndex = iNextIndex;
}
//往上置顶
void CBOrderColorDLg::OnBnClickedTop()
{
SetFocus();
exchangeData(m_iColorIndex, 0);
m_iColorIndex = 0;
}
//往下置顶
void CBOrderColorDLg::OnBnClickedBottom()
{
SetFocus();
int iNewIndex = m_pOrderColorList->GetItemCount() - 1;
exchangeData(m_iColorIndex, iNewIndex);
m_iColorIndex = iNewIndex;
}
//交换数据
void CBOrderColorDLg::exchangeData(int iOldIndex, int iNewIndex)
{
CBIndexColor* oldColor = (CBIndexColor*) m_pOrderColorList->GetItemData(iOldIndex); //当前数据
CBIndexColor* newColor = (CBIndexColor*) m_pOrderColorList->GetItemData(iNewIndex); //下一行数据
m_pOrderColorList->SetItemData(iNewIndex,(DWORD)oldColor);
m_pOrderColorList->SetItemText(iNewIndex, 1, _T(""), NULL, oldColor->getColor());
m_pOrderColorList->SetItemData(iOldIndex,(DWORD)newColor);
m_pOrderColorList->SetItemText(iOldIndex, 1, _T(""), NULL, newColor->getColor());
UINT flag = LVIS_SELECTED|LVIS_FOCUSED;
m_pOrderColorList->SetItemState(iOldIndex, 0, flag);//取消原选中项目
m_pOrderColorList->SetCurSel(iNewIndex);//使得新位置处项目高亮显示并获得焦点
}
//开始拖动
void CBOrderColorDLg::OnLvnBegindragOrdercolor(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
m_iColorIndex = m_pOrderColorList->GetCurSel();
m_pOrderColorList->SetExtendedStyle(LVS_EX_ONECLICKACTIVATE | LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT);
m_pOldColor = (CBIndexColor*) m_pOrderColorList->GetItemData(m_iColorIndex);
m_pOrderColorList->DeleteItem(m_iColorIndex);
for (int i = 0; i < m_pOrderColorList->GetItemCount(); i++ )
{
CString sIndex;
sIndex.Format(_T("颜色%d"), i);
m_pOrderColorList->SetItemText(i, 0, sIndex);//添加i行0列的数据,序号
}
SetCapture();//开始捕捉鼠标消息,这样之后的鼠标移动和放开都会在此控件上执行
m_bBeginDraw = true;
*pResult = 0;
}
//鼠标移动时拖动
void CBOrderColorDLg::OnMouseMove(UINT nFlags, CPoint point)
{
if (!m_bBeginDraw)
return;
int iCurIndex = 0;
getCurrentIndex(point, iCurIndex);
m_pOrderColorList->SetCurSel(iCurIndex);
m_iColorIndex = iCurIndex;
CDialog::OnMouseMove(nFlags, point);
}
//结束拖动
void CBOrderColorDLg::OnLButtonUp(UINT nFlags, CPoint point)
{
if (!m_bBeginDraw)
return;
GetCapture();
ReleaseCapture();
SetFocus();
int iCurIndex = 0;
m_pOrderColorList->SetExtendedStyle(LVS_EX_ONECLICKACTIVATE | LVS_EX_GRIDLINES);
getCurrentIndex(point, iCurIndex);
m_pOrderColorList->InsertItem(iCurIndex, _T("")); //添加行
m_pOrderColorList->SetItemData(iCurIndex,(DWORD)m_pOldColor);//将行号与数据关联
m_pOrderColorList->SetItemText(iCurIndex, 1, _T(""), NULL, m_pOldColor->getColor());//添加i行1列的数据,颜色
m_pOrderColorList->SetCurSel(iCurIndex);
m_iColorIndex = iCurIndex;
for (int i = 0; i < m_pOrderColorList->GetItemCount(); i++ )
{
CString sIndex;
sIndex.Format(_T("颜色%d"), i);
m_pOrderColorList->SetItemText(i, 0, sIndex);//添加i行0列的数据,序列号
}
m_bBeginDraw = false;
CDialog::OnLButtonUp(nFlags, point);
}
//获得鼠标所在的list索引
void CBOrderColorDLg::getCurrentIndex(CPoint point, int &iCurIndex)
{
CPoint indexPt;
double dy, dMinDistance;
GetParent()->ScreenToClient(&point);
m_pOrderColorList->GetItemPosition(iCurIndex, &indexPt);
dy = indexPt.y;
dMinDistance = fabs(indexPt.y - dy - point.y);
for (int iIndex = 1; iIndex < m_pOrderColorList->GetItemCount(); iIndex++)
{
m_pOrderColorList->GetItemPosition(iIndex, &indexPt);
double dDist = fabs(indexPt.y - dy - point.y);
if(dDist < dMinDistance)
{
dMinDistance = dDist;
iCurIndex = iIndex;
}
}
UINT flag = LVIS_SELECTED|LVIS_FOCUSED;
//m_iColorIndex = m_pOrderColorList->GetCurSel();
m_pOrderColorList->SetItemState(m_iColorIndex, 0, flag);//取消原选中项目
if((dMinDistance > dy)&&(iCurIndex == (m_pOrderColorList->GetItemCount() - 1)))
iCurIndex ++;
}
//获得索引的另一种方法,备注, 即点击在list上时获得索引,这是重写的listctrl类特有的。
LRESULT CBEngravingSettingDlg::onBlnClicked(WPARAM wParam, LPARAM lParam)
{
CBEngraveSetting *pSetting = (CBEngraveSetting*)m_List.GetItemData((int)wParam);
return 1;
}
//设置某一列不显示,是重写的listctrl类特有的,由名字可知,因为set小写。
isSelSubItemUnShowm_ListCtrl.setIsSelSubItemUnShow(3); //第4列不为选中状态
ListCtrl鼠标拖动Item
最新推荐文章于 2019-06-19 23:32:05 发布