博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MFC TreeCtrl 控件(一):简单使用
阅读量:7238 次
发布时间:2019-06-29

本文共 3362 字,大约阅读时间需要 11 分钟。

    本文描写叙述了 MFC 中的树形控件 TreeCtrl 的简单使用,内容包含数据项的加入、图标设置、提示信息设置等。

    新建基于对话框的应用程序,加入一个 TreeCtrl ,为其定义一个控件变量 m_userTreeCtrl,并将其属性:Has Buttons、Has Lines、Lines At Root和 Info Tip 都设为True。插入3个Icon资源,分别作为 管理员、部门、用户的图标。定义类变量 CImageList m_imageList 保存图标列表。定义类变量 CString  m_csUserTips 设置用户提示信息,管理员和部门的提示信息通过其它方式提示。

    在对话框初始化函数中加入代码:

HICON hIcon[3];	hIcon[0] = theApp.LoadIcon(IDI_MANAGER);	hIcon[1] = theApp.LoadIcon(IDI_MANAGEMENT);	hIcon[2] = theApp.LoadIcon(IDI_USER);	m_imageList.Create(16, 16, ILC_COLOR32, 3, 3);	for(int i=0; i<3; i++)		m_imageList.Add(hIcon[i]);	m_userTreeCtrl.SetImageList(&m_imageList, TVSIL_NORMAL);	m_csUserTips = _T("用户");	InitUserTree(); // 插入数据项
    当中,InitUserTree 函数代码例如以下:

void COnsitevideoDlg::InitUserTree(){	HTREEITEM hRoot; // 根节点,管理员	HTREEITEM hCity; // 部分节点	HTREEITEM hUser; // 用户节点	hRoot = m_userTreeCtrl.InsertItem(_T("DNP"), 0, 0);	//	hCity = m_userTreeCtrl.InsertItem(_T("測试部门1"), 1, 1, hRoot, TVI_LAST);	m_userTreeCtrl.SetItemData(hCity, 1); // 传入简单数值	hUser = m_userTreeCtrl.InsertItem(_T("測试用户11"), 2, 2, hCity, TVI_LAST);	m_userTreeCtrl.SetItemData(hUser, (DWORD_PTR)m_csUserTips.GetBuffer()); // 传入指针	hUser = m_userTreeCtrl.InsertItem(_T("測试用户12"), 2, 2, hCity, TVI_LAST);	m_userTreeCtrl.SetItemData(hUser, (DWORD_PTR)m_csUserTips.GetBuffer());	hUser = m_userTreeCtrl.InsertItem(_T("測试用户13"), 2, 2, hCity, TVI_LAST);	m_userTreeCtrl.SetItemData(hUser, (DWORD_PTR)m_csUserTips.GetBuffer());	//	hCity = m_userTreeCtrl.InsertItem(_T("測试部门2"), 1, 1, hRoot, TVI_LAST);	m_userTreeCtrl.SetItemData(hCity, 1);	hUser = m_userTreeCtrl.InsertItem(_T("測试用户21"), 2, 2, hCity, TVI_LAST);	m_userTreeCtrl.SetItemData(hUser, (DWORD_PTR)m_csUserTips.GetBuffer());	hUser = m_userTreeCtrl.InsertItem(_T("測试用户22"), 2, 2, hCity, TVI_LAST);	m_userTreeCtrl.SetItemData(hUser, (DWORD_PTR)m_csUserTips.GetBuffer());	hUser = m_userTreeCtrl.InsertItem(_T("測试用户23"), 2, 2, hCity, TVI_LAST);	m_userTreeCtrl.SetItemData(hUser, (DWORD_PTR)m_csUserTips.GetBuffer());	//	hCity = m_userTreeCtrl.InsertItem(_T("測试部门3"), 1, 1, hRoot, TVI_LAST);	m_userTreeCtrl.SetItemData(hCity, 1);	hUser = m_userTreeCtrl.InsertItem(_T("測试用户31"), 2, 2, hCity, TVI_LAST);	m_userTreeCtrl.SetItemData(hUser, (DWORD_PTR)m_csUserTips.GetBuffer());	hUser = m_userTreeCtrl.InsertItem(_T("測试用户32"), 2, 2, hCity, TVI_LAST);	m_userTreeCtrl.SetItemData(hUser, (DWORD_PTR)m_csUserTips.GetBuffer());}
    为了显示控件节点提示信息。须要对应 TreeCtrl 控件的 TVN_GETINFOTIP 消息。其响应代码例如以下:

void COnsitevideoDlg::OnTvnGetInfoTipUsertree(NMHDR *pNMHDR, LRESULT *pResult){	LPNMTVGETINFOTIP pGetInfoTip = reinterpret_cast
(pNMHDR); // TODO: 在此加入控件通知处理程序代码 *pResult = 0; // 设置提示信息 NMTVGETINFOTIP* pTVTipInfo = (NMTVGETINFOTIP*)pNMHDR; HTREEITEM hRoot = m_userTreeCtrl.GetRootItem(); CString csText; // 设置提示信息的2种方法:通过Item类型推断、依据SetItemdata设置的參数 if(pTVTipInfo->hItem == hRoot) csText = _T("管理员 "); else if(pTVTipInfo->lParam==1) csText = _T("部门"); else { BSTR bstrTemp = (BSTR)(pTVTipInfo->lParam); csText = bstrTemp; } // 使用安全版本号的拷贝函数。csText获取的长度须要加1,包括结束符 _tcscpy_s(pTVTipInfo->pszText, csText.GetLength()+1, csText.GetBuffer());}

    在上面的函数中,通过两种方式设置了控件节点的提示信息,第一种是直接推断接口的类型,然后设置器提示信息,如根节点。另外一种是依据用 SetItemData 函数为节点设置的额外数据来设置的。

SetItemData 可传入简单数值或一个指针,部门节点传入的就是简单的数值类型。通过推断该类型的值,然后设置其提示信息,其它的节点也能够通过这样的方法来设置。 用户节点传入的则是一个字符串指针,此时,就能够直接获取该字符串的值。并将其设置为用户节点的提示信息。

特别太须要注意的是该字符串不能是一个 InitUserTree 函数中的局部变量,否则指针引用将出错。

    效果截图例如以下:
                                                   TreeCtrl 控件效果截图

你可能感兴趣的文章
Web开发(进阶)- Django【基础篇】
查看>>
Java MD5
查看>>
百度首页新增百度成就
查看>>
python 面向对象&常用模块(二)
查看>>
如何设置华为交换机,使其可以通过WEB管理网络设备
查看>>
什么是”灰度发布“
查看>>
处理xml
查看>>
windows 7接内外网出现冲突
查看>>
ORA-16014:日志1的序列号83未归档,没有可用的目的地的错误
查看>>
我的友情链接
查看>>
Ubuntu下python编辑器ulipad的安装
查看>>
springMVC连接mysql数据库
查看>>
监控页面-php&SQL学习(一)
查看>>
如何添加 OPEN MANAGER ESSENTIALS 被控端
查看>>
每日学习笔记(21)
查看>>
我的友情链接
查看>>
apache.commons.logging.Log
查看>>
python-72:BS4中的clear(),extract(),decompose()
查看>>
log4j:WARN No appenders could be found for logger
查看>>
直播疑难杂症排查(10)— 直播功耗高
查看>>