单机列标题,listview自动排序

WhoCan 2013-03-30 01:54:34
哪位大神给看一下,listview排序的问题,
//处理单击消息
case WM_NOTIFY:
NMHDR * pNMHDR= (NMHDR *) lParam;
listview=GetDlgItem(hWnd,IDC_LIST1);
if(pNMHDR->code==LVN_COLUMNCLICK)

{
//LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
NMLISTVIEW *pNMListView = (NMLISTVIEW*)pNMHDR;
ListView_SortItems(listview,CompareFunc,(LPARAM)pNMListView->iSubItem);
if(sort_type==false)
sort_type=true;
else
sort_type=false;
break;
}
//回调函数编写
int CALLBACK CompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)

{
static TCHAR szBuf1[50], szBuf2[50];
int ret;
ListView_GetItemText(listview, lParam1, lParamSort, szBuf1, 50);
ListView_GetItemText(listview, lParam2, lParamSort, szBuf2, 50);

if(sort_type)
{
ret = lstrcmp(szBuf1, szBuf2);
}
else
{
ret = -lstrcmp(szBuf1, szBuf2);
}
return ret;

}
//往listview里边添内容
LVITEMA item1
Info info[4];//定义一个结构体,期中只有一个TCHAR s1[max_path];
ZeroMemory(&info,sizeof(info)/sizeof(Info));
HWND list1=GetDlgItem(hwnd,IDC_LIST1); //得到listview句柄
ZeroMemory(&item1,sizeof(item1)/sizeof(LVITEMA));
int ItemCount = ListView_GetItemCount(list1); //得到listview行数
item1.mask=LVIF_TEXT|LVIF_PARAM;
item1.iSubItem=0;
item1.iItem=ItemCount;
item1.pszText=info[0].s1;
int j=ListView_InsertItem(list1,&item1);
item1.lParam=j;
for (int i=1; i<4; i++)
{

item1.iSubItem=i;
ListView_SetItemText(list1,j,i,info[i].s1);
}
...全文
174 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
WhoCan 2013-04-01
  • 打赏
  • 举报
回复
还是不太明白?
cptang 2013-03-31
  • 打赏
  • 举报
回复

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ListView1ColumnClick(TObject *Sender, TListColumn *Column)
{
    int i, m, n, j ;
    static bool od = true ;
    const AnsiString Captions1[4]={"姓名","性别","籍贯","学历"} ;
    for(int i=0; i<ListView1->Columns->Count; ++i)
    ListView1->Columns->Items[i]->Caption = Captions1[i]  ;
    od = !od ;
    n = Column->Index ;
    m = ListView1->Items->Count ;
    if(od)
    {
       Column->Caption = Column->Caption + "△" ;
    }
    else
       Column->Caption = Column->Caption + "▽" ;

    ListView1->Items->Add();
    if (n==0)
    {
       for(i=0;i< m-1;i++)
       for(j=i+1;j< m;j++)
       if(od)
       {
          if(ListView1->Items->Item[i]->Caption > ListView1->Items->Item[j]->Caption)
          {
             ListView1->Items->Item[m] = ListView1->Items->Item[i] ;
             ListView1->Items->Item[i] = ListView1->Items->Item[j] ;
             ListView1->Items->Item[j] = ListView1->Items->Item[m] ;
          }
       }
       else
       {
          if(ListView1->Items->Item[i]->Caption < ListView1->Items->Item[j]->Caption)
          {
             ListView1->Items->Item[m] = ListView1->Items->Item[i];
             ListView1->Items->Item[i] = ListView1->Items->Item[j];
             ListView1->Items->Item[j] = ListView1->Items->Item[m];
          }
       }
    }
    else
    {
       for(i=0;i< m-1;i++)
          for(j=i+1;j< m;j++)
          if(od)
          {
             if(sg(ListView1->Items->Item[i]->SubItems->Text,n-1) > sg(ListView1->Items->Item[j]->SubItems->Text,n-1))
             {
                ListView1->Items->Item[m] = ListView1->Items->Item[i] ;
                ListView1->Items->Item[i] = ListView1->Items->Item[j] ;
                ListView1->Items->Item[j] = ListView1->Items->Item[m] ;
             }
          }
          else
          {
             if(sg(ListView1->Items->Item[i]->SubItems->Text,n-1) < sg(ListView1->Items->Item[j]->SubItems->Text,n-1))
             {
                ListView1->Items->Item[m] = ListView1->Items->Item[i];
                ListView1->Items->Item[i] = ListView1->Items->Item[j];
                ListView1->Items->Item[j] = ListView1->Items->Item[m];
             }
          }
    }
    ListView1->Items->Delete(m);
}
//---------------------------------------------------------------------------
AnsiString TForm1::sg(AnsiString str,int n)
{
    int i,l;
    AnsiString qq(str);
    l = qq.Length();
    AnsiString p(str);
    char a[]="\r\n";
    int j=0,k=0;
    for(j=1;j < l;j++)
    {
       i=1;
       while(qq[j]!=a[0] && qq[j+1]!=a[1])
       {
          p[i++]=qq[j];
          j++;
       }
      k++;
      if((k-1)==n)
      break;
    }
    p[i]=NULL;
    return (p);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
// 下移i++; 
// 上移i--; 
    int j ;
    int m ;
    m = ListView1->Items->Count ;
    if(ListView1->SelCount == 0)
    {
       ShowMessage("请选择需要移动的项目!") ;
       return ;
    }
    i = ListView1->Items->IndexOf(ListView1->Selected); 
   
 //   i-- ;
    j = i - 1  ;
    if(j<0)
    {
       ListView1->Items->Item[j+1]->Selected=True;
       ListView1->SetFocus() ;
       return  ;
    }
    else
    {
        ListView1->Items->Add();
        ListView1->Items->Item[m] = ListView1->Items->Item[i];
        ListView1->Items->Item[i] = ListView1->Items->Item[j];
        ListView1->Items->Item[j] = ListView1->Items->Item[m];
        ListView1->Items->Delete(m);
        ListView1->Items->Item[j]->Selected=True; 
        ListView1->SetFocus() ; 
    }
    
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    int j ;
    int m ;
    m = ListView1->Items->Count ;      
    if(ListView1->SelCount == 0)
    {
       ShowMessage("请选择需要移动的项目!") ;
       return ;
    }
    i = ListView1->Items->IndexOf(ListView1->Selected);
  
    j = i + 1 ;
    if(j > ListView1->Items->Count - 1)
    {
       ListView1->Items->Item[j-1]->Selected=True;
       ListView1->SetFocus() ;
       return  ;
    }
    else
    {    
        ListView1->Items->Add();
        ListView1->Items->Item[m] = ListView1->Items->Item[i];
        ListView1->Items->Item[i] = ListView1->Items->Item[j];
        ListView1->Items->Item[j] = ListView1->Items->Item[m];
        ListView1->Items->Delete(m);
        ListView1->Items->Item[j]->Selected=True; 
        ListView1->SetFocus() ; 
    }

}
//---------------------------------------------------------------------------


WhoCan 2013-03-31
  • 打赏
  • 举报
回复
好的,先谢了,我的qq:343379173
cptang 2013-03-30
  • 打赏
  • 举报
回复
关于listview的单击排序问题 回头给你发我以前的一段代码 用STL标准库

1,221

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧