ListCtrl鼠标拖动Item

来源:互联网 发布:java weka bp神经网络 编辑:程序博客网 时间:2024/05/16 07:49
//上移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列不为选中状态