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