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)
{
    ...
}

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

  • 5
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,在动态创建的 CTreeCtrl 对象的 Create 函数中添加以下代码,以便在单击某个节点时调用自定义的响应函数: ```c++ m_TreeCtrl.ModifyStyle(0, TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT); m_TreeCtrl.SetExtendedStyle(TVS_EX_DOUBLEBUFFER, TVS_EX_DOUBLEBUFFER); m_TreeCtrl.SetItemHeight(20); // 设置每个节点的高度 m_TreeCtrl.EnableToolTips(TRUE); // 开启节点提示 // 绑定单击事件响应函数 m_TreeCtrl.m_hWnd = this->GetSafeHwnd(); // 将当前窗口的句柄赋给 CTreeCtrl 对象的句柄 m_TreeCtrl.m_pfnSuperWindowProc = ::DefWindowProc; m_TreeCtrl.m_pfnOldTreeCtrlProc = (WNDPROC)::SetWindowLong(m_TreeCtrl.m_hWnd, GWL_WNDPROC, (LONG)TreeCtrlProc); ``` 然后,实现 TreeCtrlProc 函数来处理单击事件: ```c++ LRESULT CALLBACK TreeCtrlProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { CTreeCtrl* pTreeCtrl = (CTreeCtrl*)CWnd::FromHandle(hWnd); if (pTreeCtrl == NULL) { return 0; } // 处理单击事件 if (uMsg == WM_LBUTTONDOWN) { HTREEITEM hSelectedItem = pTreeCtrl->GetSelectedItem(); if (hSelectedItem != NULL) { CString strItemText = pTreeCtrl->GetItemText(hSelectedItem); // 在此处添加您的响应代码 } } // 调用默认的窗口处理函数 return ::CallWindowProc(pTreeCtrl->m_pfnOldTreeCtrlProc, hWnd, uMsg, wParam, lParam); } ``` 这样,当用户单击 CTreeCtrl 对象中的任何一个节点时,就会触发单击事件,您可以在事件响应函数中添加自己的响应代码来处理单击事件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值