给ListCtrl排序方法

列表控制有一个特殊的功能,当以详细资料方式显示时,列表顶部的表头可以当作按钮来使用,这可以通过列表控制创建时的风格来控制。当鼠标点击列表头名称时,列表控制就会向其父窗口发送一个LNV_COLUMNCLICK消息,利用类导向中列表控制IDC_LISTCTRL对应的LNV_COLUMNCLICK消息加入相应处理函数,就可将表列按照特定顺序进行排列。其函数使用方法见程序,其中iSort为排序的表列索引号,(PFNLVCOMPARE)CompareFunc为进行具体排序的回调函数,也就是说,通过鼠标点击表头实现的排序过程是由第三方开发的专用排序函数来实现的,排序函数只是实现表项的具体比较操作,而整个排序过程是由SortItemS属性通过不断调用这个函数来实现的。正常的排序过程是升序方式,通过调换排序函数中的参数值,就可实现降序排列,即将PARAM1与PARAM2调换位置。这个回调函数的前两个参数为表列中表项的索引号,第三个参数为排序的表列索引号。

void   CVCLISTDlg::OnColumnclickListctrl(NMHDR*   pNMHDR,   LRESULT*   pResult)  

{   //鼠标左键单击表头处理函数

NM_LISTVIEW*   pNMListView   =   (NM_LISTVIEW*)pNMHDR;

//   TODO:   Add   your   control   notification   handler   code   here

static   int   iSorted=-1;//排列序号

if   (pNMListView-> iSubItem==iSorted)   return;

iSorted=pNMListView-> iSubItem;

m_ListCtrl.SortItems((PFNLVCOMPARE)CompareFunc,iSorted);

*pResult   =   0;

}

//排序时比较表项的回调函数

int   CALLBACK   CompareFunc(LPARAM   lParam1,   LPARAM   lParam2,LPARAM   lParamSort)

{   char   *text1,*text2;

switch   (lParamSort){

case   0L:text1=Sps[lParam1].szPm;

text2=Sps[lParam2].szPm;break;

case   1L:text1=Sps[lParam1].szSl;

text2=Sps[lParam2].szSl;break;

case   2L:text1=Sps[lParam1].szDj;

text2=Sps[lParam2].szDj;break;

case   3L:text1=Sps[lParam1].szJe;

text2=Sps[lParam2].szJe;break;

}

return   (strcmp(text1,text2));//结果为> 0   =0   <0

}

同样,也可以通过专用按钮来实现排序功能,如本文的排序按钮对应的功能代码如下:

void   CVCLISTDlg::OnSort()  

{   //   TODO:   Add   your   control   notification   handler   code   here

m_ListCtrl.SortItems((PFNLVCOMPARE)CompareFunc,0);}

你可能感兴趣的:(ListView,callback)