探讨CtreeCtrl::SortChildrenCB

news/2024/8/22 14:06:00

探讨CtreeCtrl::SortChildrenCB

  在实际开发中,我们往往需要对树控件(CTreeCtrl)的节点进行排序。事实上,大部分的排序工作可以用CTreeCtrl::SortChildren来实现,不过CTreeCtrl::SortChildren是简单的通过树项目名称排序,假如要实现个性化排序,则需要借助SortChildrenCB

  CTreeCtrl::SortChildrenCB这个函数用来实现对树控件的个性化排序,但是,由于这个函数本身的缺陷,初学者很难自如的使用这个函数来对树进行排序,往往失败了还不知道是什么原因。在这里,我将详细介绍一下SortChildrenCB的用法。

  首先看看SortChildrenCB的定义:

BOOL SortChildrenCB( LPTVSORTCB pSort );

typedef struct tagTVSORTCB

{

        HTREEITEM       hParent;

        PFNTVCOMPARE  lpfnCompare;

        LPARAM          lParam;

} TVSORTCB, *LPTVSORTCB;

解释一下各个参数的含义:

LPTVSORTCB psort 这是一个结构体,包含了执行本函数必须的数据。

hParent 这个参数标志的是一个树的某一项,我们要排序的,就是这个项的子项。

lpfnCompare 这个参数标志的是一个很重要的回调函数,下面会单独介绍。

lParam 这个参数是指向要排序的树控件的指针

  我刚才说到,lpfnCompare是一个很重要的参数,这是因为它所标志的回调函数,将直接影响到排序的结果:

typedef int (CALLBACK *PFNTVCOMPARE)(

LPARAM lParam1,

LPARAM lParam2,

LPARAM lParamSort);

  这就是排序回调函数的定义。

  假如你用过STL,就一定知道qsort(),这个快速排序函数也要引用一个回调函数来判别两个数据项的大小,TreeCtrl的这个回调函数,恰好类似于qsort的回调函数。当我们认为第一个项应该靠前时,返回一个负数;当我们需要颠倒两个项时,返回一个整数;当我们认为两个项等价时,我们返回0。这样的定义,恰好和strcmp的返回值相同,因此我们可以很容易的写出与SortChildren等价的回调函数:

int CALLBACK CTestIconDlg::MyCompareProc(LPARAM lParam1,

                                   LPARAM lParam2,

                                   LPARAM lParamSort)

{

     CTreeCtrl*   pTree = (CTreeCtrl *) lParamSort;

     CString    strItem1 = pmyTreeCtrl->GetItemText((HTREEITEM) lParam1);

     CString    strItem2 = pmyTreeCtrl->GetItemText((HTREEITEM) lParam2);

    

     return strcmp(strItem2, strItem1);

}

在这里,我要着重说明两点:

第一,看到lParamSort了吗?它就是你刚才为TVSORTCB::lParam所赋的值。

第二,lParam1lParam2是什么?树的两个项的data,你可以用SetItemData来指定。在刚才的例子里面,我们可以断定它是曾经执行了类似于

HTREEITEM hLeaf = m_Tree.InsertItem(&tciItem);

m_Tree.SetItemData(hLeaf, (DWORD)hLeaf);

的代码。在这段代码里面,该项的HTREEITEM被设置成了自身的Data。这很关键,因为这个值就是排序的依据。

好了,对于就介绍 CTreeCtrl::SortChildren 就介绍到这里



http://www.niftyadmin.cn/n/3655247.html

相关文章

计算机辅助干预会议,我系一篇论文被MICCAI 2019(国际医学图像计算和计算机辅助干预会议)录用...

近日,国际医学图像计算和计算机辅助干预会议MICCAI2019 (International Conference on Medical Image Computing and Computer Assisted Intervention, MICCAI)录用结果公布,我系唐晓颖助理教授课题组有一篇论文被接收。MICCAI是由国际医学图像计算和计算…

用纯粹的C++编写COM组件

赵湘宁下载本文代码本文提供一个完全用C实现的进程内(DLL)COM服务器,不要ATL或MFC提供任何支持。用这种方式编写COM对象可以让你深入地洞察到COM处理进程内服务器的方法以及COM是如何创建类工厂的。利用本文提供的这个简单框架你可以实现很基…

计算机基础结构,计算机基础知识(系统结构够造)

《计算机基础知识(系统结构够造)》由会员分享,可在线阅读,更多相关《计算机基础知识(系统结构够造)(2页珍藏版)》请在人人文库网上搜索。1、计算机系统是由数量和品种繁多的部件组成的。各种部件技术内容十分丰富,主要有运算与控制技术、信息…

网络程序设计 Sockets

关于Socket编程,在《Linux从入门到精通》里有简单的介绍,更详细的可以参考《UNIX网络编程 卷1:联网的API:套接字与XTI 第2版》清华影印版,其中还讲了线程(Thread)编程。极好的参考书,可惜没人把它翻译过来。胡淑瑜翻译…

显示出现计算机代码,电脑出现蓝屏并提示代码:c0000218 的原因分析

“STOP:c0000218 {Registry File Failure}”是一个很典型的错误信息,造成错误的塬因是硬盘错误或硬盘损坏。解决办法如下:1. 从 Windows XP 光盘启动计算机。如果出现提示,请选择从光盘启动计算机必须选择的任何选项。2. 当提示你选择“修复或…

用Socket和MSHTML对象模型创建自己的浏览器

用Socket和MSHTML对象模型创建自己的浏览器中央财经大学管理信息系 薛 瑛 01-4-20 上午 11:15:22HTTP协议和WEB浏览器的诞生给我们的网络增加了更多的精彩。但在实际应用中我们可能会有不同的需要而不是单纯的使用浏览器,譬如在我们的应用程序中加入浏览互联网的功能…

在哪把iphone的计算机,iphone备份在哪?iPhone备份方法

导读:iPhone手机一直是我们追捧的手机品牌,它的功能十分丰富,性能也十分强大,但是当iPhone手机使用时间长了以后,也会出现一些问题,当我们队iPhone手机进行刷机的时候,我们需要对iPhone内部的数…

BSD Socket 简易入门手册

BSD Socket 简易入门手册翻译:Wilbur Lang介绍 类比 (什么是 socket ?) 装上你的新电话(怎样侦听?) 拨号 (如何调用 socket) 谈话(如何通过 sockets 交谈) 挂起(结束) 世界语(交流的语言很重要) 未来在你的掌握了(下一步?) 介绍 当…