首页 理论教育VC++MFC视频教程:列表项排序方法

VC++MFC视频教程:列表项排序方法

【摘要】:真正的排序列表控件应当是,当单击第一列标头时,按编号对所有列表项进行排序;单击第二列时,按姓名对所有列表项进行排序;以此类推单击不同列就按不同的规则对所有列表项排序。打开本章第2节的“Si”工程,本节继续演示使用CListCtrl::SortItems函数对列表项排序的方法。5)以此类推,再创建按国籍排序的回调函数并修改代码。在列表控件中若要按多种方式对列表项排序,就要在调用CListCtrl::SortItems函数时,代入不同的回调函数的地址。

真正的排序列表控件应当是,当单击第一列标头时,按编号对所有列表项进行排序;单击第二列时,按姓名对所有列表项进行排序;以此类推单击不同列就按不同的规则对所有列表项排序。

打开本章第2节的“Si”工程,本节继续演示使用CListCtrl::SortItems函数对列表项排序的方法。

1)在类视图中的主对话框类名称上单击鼠标右键,在弹出的快捷菜单中,选择“Add Member Function”命令,创建普通成员函数,如图10-14所示。

2)创建的函数用于作为排序规则,在排序过程中由系统回调,如图10-15所示。

978-7-111-46378-8-Chapter10-25.jpg

图10-14 添加普通成员函数

978-7-111-46378-8-Chapter10-26.jpg

图10-15 创建系统回调函数(必须指定静态成员函数)

3)单击“确定”按钮,完成按编号排序的回调函数的创建并修改代码。

978-7-111-46378-8-Chapter10-27.jpg

4)以此类推,再创建按姓名排序的回调函数并修改代码。

978-7-111-46378-8-Chapter10-28.jpg(www.chuimin.cn)

5)以此类推,再创建按国籍排序的回调函数并修改代码。

978-7-111-46378-8-Chapter10-29.jpg

978-7-111-46378-8-Chapter10-30.jpg

6)补充OnColumnclickList的函数代码,当单击列标头时调用SortItems函数执行排序。

978-7-111-46378-8-Chapter10-31.jpg

7)编译并运行,测试代码,如图10-16所示。

978-7-111-46378-8-Chapter10-32.jpg

图10-16 查看运行结果

单击第一列标头时,按编号的整数值大小进行排序;单击第二列标头时,按名字的ASCII编码或汉字拼音进行排序;单击第三列标头时,按国家顺序排序,也就是组合框内的列表顺序排序。

在列表控件中若要按多种方式对列表项排序,就要在调用CListCtrl::SortItems函数时,代入不同的回调函数的地址。在排序过程中排序算法逐一对比每个列表项,并回调对应的规则函数“请示”是否交换两个列表项。因此,这类回调函数(例如,byNumb等),叫作排序规则函数。

CListCtrl::SortItems及排序规则函数的详细使用方法,可以参见MSDN中的函数说明。回调函数必须是C格式全局函数或者静态的类成员函数,这类函数中都没有this指针,因此,也就不能在回调函数中调用类的成员变量和成员函数。SortItems函数的第二个参数,是用于传递给回调函数的第三个参数的。利用这一关系,可以将一个类对象的地址以32位变量的方式传入回调函数中,这样才能间接地访问到类对象的成员。