//上移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列不为选中状态