1、在TreeView节点的前面加了个复选框,怎样判断是否在checkbox前打勾了呢?
2、如果有叶子的节点改变了复选属性,如何使子节点和父节点一致呢?
谢谢啊!!

解决方案 »

  1.   

    去查查fctreeview  自带checkbox的
      

  2.   

    我是通过下面语句加了复选框的
         SetWindowLong(mapTreeView.Handle, GWL_STYLE
          , GetWindowLong(mapTreeView.Handle, GWL_STYLE) or $00000100);现在面临的是怎样判断是否在节点前打勾了呢?
      

  3.   

    TreeView1.GetHitTestInfoAt(X, Y) in [htOnButton]
      

  4.   

    因为在学习,所以就想用TreeView来实现
    各位多帮忙,谢谢啦
      

  5.   

      function GetTreeNodeChecked(Node:TTreeNode):Boolean; 
      var 
        vItem : TTVItem; 
      begin 
        vItem.mask:=TVIF_HANDLE or TVIF_STATE; 
        vItem.hItem:=Node.ItemId; 
        vItem.stateMask:=TVIS_STATEIMAGEMASK; 
        TreeView_GetItem(Node.TreeView.Handle,vItem); 
        Result:=Boolean((vItem.state shr 12)-1); 
      end; 
    问下:我编译时,为什么提示TTVItem未定义呢?
    Undeclared identifier:'TTVItem'
      

  6.   

    是不是delphi的版本问题?
    壳参看: http://www.cnblogs.com/del/archive/2008/05/15/1198645.html
      

  7.   

    通过treeview.items[i].stateindex和imageindex是可以自行实现复选框的,需要预先准备打勾和没打勾的小图到imagelist
    这样控制起来就是完全自己掌握了
      

  8.   

    具体就是一系列操作了:
    需要预先准备打勾和没打勾(或灰色勾)的小图到imagelist
    把treeview1.stateimage设为这个imagelist
    节点.stateindex==1就是打勾,节点.stateindex==2就是没打勾
    节点的鼠标点击事件里判断是不是点在stateimage模拟的这个复选框上,是则切换该节点的stateindex
    如果想同时选择或清除所有子节点的复选框,也就在此事件里递归进行
    如果想同时决定上级节点的复选框(子节点部分选中,父节点复选框为灰色勾),也可以在此事件里判断实现
      

  9.   

    Delphi的代码,参考一下吧   
      首先当然是要在Form加一个TTreeView控件咯。:)   
        
      然后在单元的公共uses部分加一个Commctrl单元。   
        
      好,接下来要做三件事,   
      1、在FormCreate事件中   
      加入如下代码   
      var   
          dw:   DWORD;   
      begin   
          dw   :=   GetWindowLong(   TreeView1.Handle,   GWL_STYLE);   
          dw   :=   dw   or   TVS_CHECKBOXES;   
          SetWindowLong(TreeView1.Handle,   GWL_STYLE   ,   dw);   
      end;   
        
      2、加两个函数   
              function   SetTreeViewNodeChecked(ATreeView:   TTreeView;   
                  ATreeNode:   TTreeNode;   Checked:   Boolean):   Boolean;   
        
              function   GetTreeViewNodeChecked(ATreeView:   TTreeView;   
                  ATreeNode:   TTreeNode):   Boolean;   
        
              第一个用来设置一个节点的是否被Check   
              第二个用来取得一个节点的Check状态。   
        
      3、就是这两个地实现代码了。   
        
      function   SetTreeViewNodeChecked(ATreeView:   TTreeView;   
          ATreeNode:   TTreeNode;   Checked:   Boolean):   Boolean;   
      var   
          tvItem:   TTVItem;   
      begin   
          tvItem.mask   :=   TVIF_HANDLE   or   TVIF_STATE;   
          tvItem.hItem   :=   ATreeNode.ItemId;   
          tvItem.stateMask   :=   TVIS_STATEIMAGEMASK;   
        
          (*Image   1   in   the   tree-view   check   box   image   list   is   the   
          unchecked   box.   Image   2   is   the   checked   box.*)   
          if   Checked   then   
              tvItem.state   :=   IndexToStateImageMask(2)   else   
              tvItem.state   :=   IndexToStateImageMask(1);   
        
          Result   :=   TreeView_SetItem(ATreeView.Handle,   tvItem);   
      end;   
        
      function   GetTreeViewNodeChecked(ATreeView:   TTreeView;   
          ATreeNode:   TTreeNode):   Boolean;   
      var   
          tvItem:   TTVItem;   
      begin   
          //   Prepare   to   receive   the   desired   information.   
          tvItem.mask   :=   TVIF_HANDLE   or   TVIF_STATE;   
          tvItem.hItem   :=   ATreeNode.ItemId;   
          tvItem.stateMask   :=   TVIS_STATEIMAGEMASK;   
        
          //   Request   the   information.   
          TreeView_GetItem(ATreeView.Handle,   tvItem);   
        
          //   Return   zero   if   it's   not   checked,   or   nonzero   otherwise.   
          Result   :=   Boolean((tvItem.state   shr   12)   -   1);   
      end;   
      

  10.   

    TTVItem 好像 delphi7 没有定义这种模式有没有灰色勾?即它的所有子节点中有部分被选择了最好有打勾事件:用于 自动选择它的所有子节点 或 自动取消它的所有子节点