MFC树控件CTreeCtrl 创建与鼠标左键单击响应

1.在OnInitDialog中:

CTreeCtrl *ctreectrl = (CTreeCtrl *)GetDlgItem(IDC_TREE1);
 //调用ModifyStyle方法修改数控件Sytle
 ctreectrl->ModifyStyle(0,TVS_HASLINES | TVS_LINESATROOT | TVS_HASBUTTONS);
 //设置树控件字体颜色
 ctreectrl->SetTextColor(RGB(0,0,255));
 //设置树控件背景颜色
 ctreectrl->SetBkColor(RGB(0,255,0));
 //添加根节点root
 HTREEITEM root = ctreectrl->InsertItem(_T("root"));
 ctreectrl->SetItemData(root,1);
 //添加父节点parent1和parent2
 HTREEITEM parent1 = ctreectrl->InsertItem(_T("parent1"));
 ctreectrl->SetItemData(parent1,2);
 HTREEITEM parent2 = ctreectrl->InsertItem(_T("parent2"));
 ctreectrl->SetItemData(parent2,3);
 //添加根节点root的子节点rootchild
 HTREEITEM rootchild = ctreectrl->InsertItem(_T("rootchild"),root);
 ctreectrl->SetItemData(rootchild,4);
 //添加父节点parent1的子节点
 HTREEITEM child1 = ctreectrl->InsertItem(_T("child1"),parent1);
 ctreectrl->SetItemData(child1,5);
 HTREEITEM child2 = ctreectrl->InsertItem(_T("child2"),parent1,child1);
 ctreectrl->SetItemData(child2,6);
 HTREEITEM child3 = ctreectrl->InsertItem(_T("child3"),parent1,child2);
 ctreectrl->SetItemData(child3,7);
 //添加父节点parent2的子节点
 HTREEITEM child11 = ctreectrl->InsertItem(_T("child11"),parent2);
 ctreectrl->SetItemData(child11,8);
 HTREEITEM child22 = ctreectrl->InsertItem(_T("child22"),parent2,child11);
 ctreectrl->SetItemData(child22,9);
 HTREEITEM child33 = ctreectrl->InsertItem(_T("child33"),parent2,child22);
 ctreectrl->SetItemData(child33,10);

2.利用ClassWizard增加树控件单击响应事件:

void CCTreeCtrlDlg::OnNMClickTree1(NMHDR* pNMHDR, LRESULT* pResult) 
{
 // TODO: Add your control notification handler code here
 CTreeCtrl *ctreectrl = (CTreeCtrl *)GetDlgItem(IDC_TREE1);
 // 第四步:在OnDClickTree函数中添加鼠标单击消息响应代码   
 //获取当前鼠标点击消息的坐标点
 CPoint pt = GetCurrentMessage()->pt;
  
 //将鼠标的屏幕坐标,转换成树形控件的客户区坐标
 ctreectrl->ScreenToClient(&pt); 
  
 UINT uFlags = 0;  
 HTREEITEM hItem = ctreectrl->HitTest(pt, &uFlags);//然后做点击测试
             //HitTest一般是指鼠标点击位置上是哪个树结点,从而得到鼠标位置的树结点
 if ((hItem != NULL) && (TVHT_ONITEM & uFlags))//如果点击的位置是在节点位置上
 {  
  ctreectrl->SelectItem(hItem);  
  //获取开始我们设置的数据,注意这就是我为什么开始要每个节点设置不同的数据的原因。
  //当然,如果你的数据节点比较少,你也可以通过获取节点的文字,如上面设置的"root,parent1,parent2······",
  //然后通过字符串比较来判断点击了哪个节点 
  int nDat = ctreectrl->GetItemData(hItem);   //然后根据不同的节点,你完成不同的动作即可 
  switch (nDat)  
  {  
  case 1:   MessageBox("root");   break; 
  case 2:   MessageBox("parent1");   break; 
  case 3:   MessageBox("parent2");   break; 
  case 4:   MessageBox("rootchild");   break; 
  case 5:   MessageBox("child1");   break; 
  case 6:   MessageBox("child2");   break; 
  case 7:   MessageBox("child3");   break; 
  case 8:   MessageBox("child11");   break; 
  case 9:   MessageBox("child22");   break; 
  case 10:   MessageBox("child33");   break; 
  default:   MessageBox("ERROR");  
  } 
  *pResult = 0;
 }
}

上面的单击响应实际测试效果非常好,之前对树形控件不了解时用了下面这种方法,进行鼠标单击响应来切换不同节点对应的不同的对话框:

CTreeCtrl TreeCtrl;
HTREEITEM hTree = GetSelectedItem();
int Sel = TreeCtrl.GetItemData(hTree);
switch(Sel)
{
    ...
}

这种方法虽然也能实现节点的切换,但是要先单击选中节点然后在单击节点才能响应。

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页