TreeView的各个节点在创建时是如何分配内存的.是在树创建时就分配了一内存块吗?各个节点的信息分配的内存是连续的吧?它的源代码在实现的最后部分都到了CommCtrl单元执行一些关于TreeView的公用函数,用了发消息的方式,怎么会这样呢?这些消息是谁在接收,接收到这些消息后执行了一些什么操作.

解决方案 »

  1.   

    只是对Windows标准控件封装...Windows SDK看过不?看过就明白了
      

  2.   

    没有原理可以讲,framework的最底层就是发送消息,响应消息,调用Win API,注册回调函数.操作系统留给你的接口就是这样,你只需要遵守,不需要问为什么.
      

  3.   

    不是TreeView的定义阿,是关于操作系统的...
      

  4.   

    操作系统当中的定义TreeView是怎么样,你就怎么样用阿...
      

  5.   

    晕啊....实现方式多种.....学过数据结构的都知道....用数组可以实现,链表可以实现.在treeview创建时是只有一个根结点的..当你每添加或删除一个节点时,内存也进行分配.消息是window的东西, treeview是window的标准控件...delphi也只过是把window 的treeview包了下.
      

  6.   

    在treeview创建时是只有一个根结点的..当你每添加或删除一个节点时,内存也进行分配.-------------------------------难道TREEVIEW每创建一个节点的时候都重新分配内存吗?就是说所有的节点是分散在内存中的,这样的效率不高,我想肯定不是这样分配的.
    应是先一次分配一个确定大小的空间,当空间不足的时候在进行扩大.用数组的方式一次要分多大,用链表就可能将节点分散.肯定用了其它的办法来防止这样的情况.
      

  7.   

    我现在的解决办法:分配一个建立了一个长度为10000的数组(节点个数最大值),保存所有的节点基本信息,节点需要四个信息来定位自己在树上的位置,上级节点位置,第一个字节点位置,上一个兄弟节点位置,下一个兄弟节点位置. 另外还有两个变量保存树的根的第一个节点的位置,树的空的节点的位置.数据初始化时设置所有的上级节点位置为NIL,第一个子节点位置为NIL,元素0的上一个兄弟节点位置为空,最后一个元素的下一个兄弟节点位置为空.其它的每一个节点的上一个兄弟位置为数组的上一个元素,下一个兄弟位置为下一个元素. 然后指定当前空节点位置为第一个元素.每添加一个节点的时候就将空节点位置下移.删除一个节点的时候将它的下一个节点位置设置成空节点位置,然后将当前空节点位置设置为要删除的节点的位置.我想系统也是这样保存树的吧.其实就是双向链表.上面所说的位置是指节点指针.对一个数组的访问,是用下标快还是直接用地址指针访问快,我想是后者吧.但有什么区别呢?现在用起来还不错.从数据库中读出的节点也都放在数组中,界面只要从数组中读取数据就可以了.TreeView节点的Data 直接保存的是数组元素指针.操作起来也很方便.
      

  8.   

    我用一种变通的方式实现了.看了WINDOWS核心编程,关于内存中堆的概念.创建一个堆,在这里分配每个节点,每个节点都有父节点,第一个子节点,下一个节点,上一个节点四个指针.现在所有的树都用一种方式实现了.