回 帖 发 新 帖 刷新版面

主题:请教:treeview的复选框

我用下面的程序,想用treeview做有复选框的树型控件,但实现的效果是前面不是复选狂,而是空白,请教该怎么改,谢谢
procedure TForm1.Button1Click(Sender: TObject); 
var node1,subnode1: TTreeNode;     
begin 
     imagelist1.ResourceLoad(rtbitmap,'smallimages',clteal);
     node1:=Treeview1.Items.Add(nil,'根'); 
     node1.ImageIndex:=0; 
     node1.SelectedIndex:=0; 
     subnode1:=TreeView1.Items.AddChildObject(node1,'结点1', nil);
     subnode1.ImageIndex:=1; 
     subnode1.SelectedIndex:=2; 
end;

回复列表 (共5个回复)

沙发

在form的oncreate事件里写:
SetWindowLong(TreeView1.Handle, GWL_STYLE, GetWindowLong(TreeView1.Handle, GWL_STYLE) or $00000100);

板凳

那怎么样将在选中复选框时,关联到复选框的标题,可以知道选中的是什么内容???
 谢谢

3 楼

不需要这样,  改用ListView可以啊

4 楼

网上有改TreeView为有复选框的代码!

文转自csdn,原作: BCB(天下三分明月夜,二分无赖是扬州)

void __fastcall TForm1::FormCreate(TObject *Sender)
{
       SetWindowLong(TreeView1->Handle,GWL_STYLE,
            GetWindowLong(TreeView1->Handle,GWL_STYLE) | TVS_CHECKBOXES);

}
//判断一个节点是否处于Checked状态
bool  GetNodeChecked(TTreeNode *ANode)
{
      TVITEM tvItem;
      tvItem.mask = TVIF_HANDLE | TVIF_STATE;
      tvItem.hItem = ANode->ItemId;
      tvItem.stateMask = TVIS_STATEIMAGEMASK;
      TreeView_GetItem(ANode->TreeView->Handle, &tvItem);
      return ((BOOL)(tvItem.state >> 12) -1);
}
//设置一个节点为Checked状态或者Unchecked状态,由参数IsSetToChecked来确定
void  SetNodeChecked(TTreeNode *ANode,bool IsSetToChecked)
{
      TVITEM tvItem;
      tvItem.mask = TVIF_HANDLE | TVIF_STATE;
      tvItem.hItem = ANode->ItemId;
      tvItem.stateMask = TVIS_STATEIMAGEMASK;
      tvItem.state = INDEXTOSTATEIMAGEMASK(IsSetToChecked?2:1);
      TreeView_SetItem(ANode->TreeView->Handle, &tvItem);
}
void  SetChildChecked(TTreeNode *ANode,bool yn)
{     // 把它的子孙都置成一样
      int count=ANode->Count;
      SetNodeChecked(ANode,yn);
      if (count!=0)
          for (int i=0;i<count;i++)    // 递归
             SetChildChecked(ANode->Item[i],yn);
}
//    TTreeNode *ClickNode;     //  保存点中的节点
//    bool      NodeChecked;    //  保存点中的节点checked
void __fastcall TForm1::TreeView1MouseMove(TObject *Sender,
      TShiftState Shift, int X, int Y)
{
      ClickNode=TreeView1->GetNodeAt(X,Y);
      if (ClickNode!=NULL)   // 保存原节点的Checked值
         NodeChecked=GetNodeChecked(ClickNode);
}
void __fastcall TForm1::TreeView1MouseDown(TObject *Sender,
      TMouseButton Button, TShiftState Shift, int X, int Y)
{
      if (ClickNode!=NULL)
         if (GetNodeChecked(ClickNode)!=NodeChecked)
            {  // 把它的子孙都置成一样
               NodeChecked=!NodeChecked;  // 更新它
               SetChildChecked(ClickNode,NodeChecked);
            }   
}



5 楼

我从网上抄的

我来回复

您尚未登录,请登录后再回复。点此登录或注册