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)
{
...
}
这种方法虽然也能实现节点的切换,但是要先单击选中节点然后在单击节点才能响应。