我需要带有Check的TreeView控件,像[东方杀毒王 2003]那样的,不知怎样做,或哪有下载最好:-)

解决方案 »

  1.   

    可以自己做,那个TreeView控件的Check功能可以用图片替换实现,
    你可以搜一下,我记得有人回答过相似问题。
      

  2.   

    可以用以下方法,如果觉得麻烦,可以找第三方控件,比如RIAZE/昆腾组件,www.51dlephi.com有下载:可以用变通的手法。
      TreeView有Images属性不是吗?自己做三张小图片:全选中、部分选中、不选状态(直接拍下CheckBox三种状态的图片在加工一下就可以了),然后在点击事件中根据具体情况设置TTreeNodes的ImageIndex就OK了。
      如果嫌麻烦的话就去Down一个控件,其实有些控件也是这样做的,界面上你是看不出来的.     :)
    **************
    Manan Patel <[email protected]>
    重载TreeView的CreateParams:
    type
      TCheckBoxTreeView = class(TTreeView)
      protected
        procedure CreateParams(var Params: TCreateParams); override;
      end;procedure TCheckBoxTreeView.CreateParams(var Params: TCreateParams);
    begin
      inherited;
      Params.Style:=Params.Style or TVS_CHECKBOXES; 
      { TVS_CHECKBOXES declared in CommCtrl }
    end;如果要Check这个CheckBox,可以用下面的代码:
    function IsNodeChecked(Node :TTreeNode) :Boolean;
    const
      TVIS_CHECKED = $2000;
    var
      TvItem :TTVItem;
    begin
      TvItem.Mask  := TVIF_STATE;
      TvItem.hItem := Node.ItemId;
      TreeView_GetItem(Node.TreeView.Handle, TvItem);
      Result := (TvItem.State and TVIS_CHECKED) = TVIS_CHECKED;
    end;procedure SetNodeChecked(Node :TTreeNode; Checked :Boolean);
    const
      TVIS_CHECKED = $2000;
    var
      TvItem :TTVItem;
    begin
      FillChar(TvItem, SizeOf(TvItem), 0);
      with TvItem do begin
        hItem     := Node.ItemId;
        Mask      := TVIF_STATE;
        StateMask := TVIS_STATEIMAGEMASK;
        if Checked then
          TvItem.State :=TVIS_CHECKED
        else
          TvItem.State :=TVIS_CHECKED shr 1;
        TreeView_SetItem(Node.TreeView.Handle, TvItem);
      end;
    end;
    可以做成事件和封装成一个类:
    private OldState :Boolean;procedure Change(Node: TTreeNode); override;
    begin
      inherited Change(Node);
      OldState := IsNodeChecked(Node);
    end;procedure Click; override;
    var
      NewState :Boolean;
    begin
      inherited Click;
      NewState := IsNodeChecked(Self.Selected);
      if NewState = OldState then Exit;
      if (NewState) and Assigned(OnNodeChecked) then OnNodeChecked()
      else if (not NewState) and Assigned(OnNodeUnChecked) then 
    OnNodeUnChecked()// OnNodeChecked & OnNodeUnchecked will be events that you declare
    end;