本人自己动手画了两个类似checkbox的ico(一个代表选中,一个代表未选中),用于模拟treeview结点+checkbox的状态,但是始终搞不出满意的效果。当选好状态后,父结点一colllasping状态就变相反的状态了...请高手相救,调出一个令人比较满意的treeview + images控件模拟treeview的各结点内嵌checkbox的效果

解决方案 »

  1.   

    //TreeView不需要图片即可实现CheckBoxes
    //代码如下,至于其它点击事件的处理,应该比较简单unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, CommCtrl, StdCtrls, ComCtrls;type
      TForm1 = class(TForm)
        TreeView1: TTreeView;
        Button1: TButton;
        Button2: TButton;
        procedure Button1Click(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure Button2Click(Sender: TObject);
      private
        { Private declarations }
        function IsNodeChecked(Node :TTreeNode) :Boolean;
      public
        { Public declarations }
      end;const
      TVIS_CHECKED = $2000;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
    begin
      if (TreeView1.Selected = nil) then Exit;  ShowMessage('Node checked? ' + BoolToStr(IsNodeChecked(TreeView1.Selected), True));
    end;procedure TForm1.FormCreate(Sender: TObject);
    var
      dw: DWORD;
    begin
      //给TreeView加上CheckBoxes
      dw := GetWindowLong( TreeView1.Handle, GWL_STYLE);
      dw := dw or TVS_CHECKBOXES;
      SetWindowLong(TreeView1.Handle, GWL_STYLE , dw);
    end;procedure TForm1.Button2Click(Sender: TObject);
      //设置node的check状态
      procedure SetNodeChecked(Node :TTreeNode; Checked :Boolean);
      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;
    begin
      if (TreeView1.Selected = nil) then Exit;  SetNodeChecked(TreeView1.Selected, not IsNodeChecked(TreeView1.Selected));
    end;//检查Node是否Checked
    function TForm1.IsNodeChecked(Node: TTreeNode): Boolean;
    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;end.
      

  2.   

    或者用免费的控件:CNPack
    http://www.cnvcl.org/index.php?lang=zh-cn
      

  3.   

    你可以看一下,Raize控件中的RzCheckListr控件,功能很不错的,当你选择父时,自动选择全部子,当取消时也全部取消!
    见意你试一下,比你用Image中图片好多了