ListCtrl鼠标拖动Item

//上移
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列不为选中状态
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值