选中项,1个或多个上移
选中项,1个或多个下移
2个选中项,交换位置
图片中,左侧是ListBox,右侧是按钮,按钮对左侧的ListBox中选中项进行位置操作。
不需要你做界面,你把代码写了贴出来就行,我测试没问题就给分
代码能用的话,再追加100分奖励,谢谢大家
listbox不支持多选?? 肯定可以支持!
下面是代码其中listbox的变量是c_list,selection选择extended(multiple不行)
先在对话框里定义一个成员函数void swap(int ,int);
void CMy1Dlg::swap(int s1,int s2)
{
CString ss1,ss2;
c_list.GetText(s1,ss1);
c_list.GetText(s2,ss2);
c_list.InsertString(s1,ss2);
c_list.DeleteString(s1+1);
c_list.InsertString(s2,ss1);
c_list.DeleteString(s2+1);
}
上移函数:
int listcount=c_list.GetCount();
int i;
for(i=1;i=0;--i)
{
if(c_list.GetSel(i)) swap(i,i+1);
}
交换
int listcount=c_list.GetCount();
int i;
int selectnum=0;
int select1=-1,select2=-1;
for(i=0;i<listcount;++i)
if(c_list.GetSel(i))
{
++selectnum;
if(select1!=-1 && select2==-1) select2=i;
if(select1==-1) select1=i;
}
if(selectnum!=2 )
{
MessageBox(_T("必须选中两项"));
}
else
{
swap(select1,select2);
}
思路正确,但有个问题,循环来上移下移效率较差,特别是元素较多的时候,会导致界面响应迟延。此外还有ItemData没有一同被处理。谢谢你的解答,如果能在完善一下,就选择你的答案为最佳回答,并送上额外的100分
追答要ItemData是用来做什么的?DWORD_PTR?
追问这个是附加在每个列表项上的指针数据,不处理的话,会造成BUG的
追答刚发给你的还有一个bug,就是选中多个数的情况第一个数移到最上面以后还可以继续移动,如果这种情况你想要的结果是多个数字移动到最前面或者最后面就停住的话要修改一下
在加两个成员函数
int CMy1Dlg::minsels()
{
int i;
int min=999;
for(i=0;imax) max=sels[i];
return max;
}
上移和下移改成
void CMy1Dlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
int i;
if(minsels()!=0)
{
for(i=0;i=0;--i)
{
if(sels[i]!=(c_list.GetCount()-1))
{
swap(sels[i],sels[i]+1);
c_list.SetSel(sels[i]+1,1);
sels[i]++;
}
}
交换的不变