MFC TreeCtrl 控件(一):简单使用

本文描述了 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<LPNMTVGETINFOTIP>(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
函数中的局部变量,否则指针引用将出错。

效果截图如下:

MFC TreeCtrl 控件(一):简单使用

时间: 2024-08-10 02:09:35

MFC TreeCtrl 控件(一):简单使用的相关文章

VS2013+MFC串口控件的简单上位机

因为做东西,正好用到这里.所以就上传了文件分享一下. 利用VS带的MFC库,用起来还是比较方便的.空间的程序构架都是自动生成的,具体的程序自己加进去就行. 里面有整个的工程 还带有一个生成的EXE文件,不嫌简陋的可以直接拿来用. 仅供参考. 下载链接: 主要我是要将win32控制命令台的程序文件的数据,通过串口输出给单片机用.所以研究了一下. 如果也有相同需求的可以参考我的下一篇文章.

MFC中如何在TreeCtrl控件中获取鼠标左键消息时的有效点击位置

MFC中,当在TreeCtrl控件中添加鼠标左键消息时,就意味着,凡是在该控件中点击左键后即会响应鼠标左键的消息,可有时我们只想记下有效的鼠标左键点击的事件,如图所示: 只想在CheckBox中点击鼠标左键时,将已选中的Item的句柄存入到链表中,那么如何只将有效的鼠标左键的消息存入链表中呢? 下面是响应鼠标左键消息时从所有鼠标左键消息都响应到只响应有效的左键消息的三个版本: 当响应鼠标左键的消息时,第一个版本: 获取鼠标的点击位置(注意:此时获取的是针对于当前屏幕的鼠标点击位置,所以需要将其转

开发ActiveX控件调用另一个ActiveX系列1——开发一个MFC ActiveX控件

ActiveX开发的教程有很多,我也从中受益匪浅,例如以下这几篇: 基本教程:http://www.cnblogs.com/guenli/articles/1629915.html 注意事项:http://jon-lt.iteye.com/blog/1676272 属性.方法开发:http://blog.csdn.net/waxgourd0/article/details/7652478 但是由于我的目的是开发一个身份证识别仪的ActiveX控件,因此我就要先仿照识别仪ActiveX开发一个Ac

如何将 MFC ActiveX 控件标记为安全,脚本和初始化

MSDN原文.ActiveX控件标记安全(可以不仅仅是MFC ActiveX) 概要 默认情况下,MFC ActiveX 控件未标记为对脚本编写是安全的和对初始化是安全的.控制运行在 Internet Explorer 中使用的安全级别设置为中或高时,这一点很明显.在上述这些模式中,控件的数据是不安全或不可能安全脚本中使用该控件,可能会显示警告. 有两个控件可用于消除这些错误的方法.第一个涉及实现 IObjectSafety 接口的控件,并对于想要更改其行为变得"安全"的互联网浏览器的

Android动态加载XML文件及控件来简单实现QQ好友印象的功能

在android开发中,我们常常会遇到界面布局控件不确定的情况.由于某些功能的原因或者为了体现某些app的特色等这些原因会导致我们在实现界面布局时需要动态去加载一些控件,那么下面就来介绍一下如何用动态加载控件来简单实现QQ中好友印象的功能,其中也会提到如何来动态加载一个XML的配置文件. 那么要实现好友印象的功能,我们需要通过以下这几个步骤: 1.界面一开始需要加载一个EditText和Button控件,用于填写好友印象和添加好友印象: 2.需要新建一个arrays.xml,在xml文件中添加上

MFC各种控件的常见操作(逐步添加中......)

由于经常切换系统或界面框架进行编程,难免有时会忘记之前的编程函数等等.所有在此自己做一个备份,以防止重新充电带来的痛苦! 1.CButton 1.1 在VC中编程实现按钮的启用(enable)和禁用(disable) 1.1.1 方式1:在对控件添加变量以后 m_btnQuit.EnableWindow(FALSE); //禁用按钮 m_btnQuit.EnableWindow(TRUE); //启用按钮 m_btnQuit.EnableWindow(FALSE); //禁用按钮 m_btnQu

Android ListView列表控件的简单使用

ListView 列表是我们经常会使用的控件, 如果想要自定义里面的显示的话是挺麻烦的, 需要新建XML.Class SimpleAdapter这两个文件, 较为麻烦. 如果我们只是想显示两.三行文字在上面, 却又不想那么麻烦呢? 那我们只要新建一个XML就够了.  这里以显示一个ListView项里三个TextView为例.  首先我们要创建一个XML文件, 这个XML文件是用来作为单个ListView项布局用的.  list_row.xml[java]<?xml version="1.

MFC树控件的使用

HICON hIcon[4];      // 图标句柄数组 // 加载三个图标,并将它们的句柄保存到数组 hIcon[0] = theApp.LoadIcon(IDI_ICON_TREE_CLOSE); hIcon[1] = theApp.LoadIcon(IDI_ICON_TREE_EXPEND); hIcon[2] = theApp.LoadIcon(IDI_ICON_VIDEO_USER_OFFLINE); hIcon[3]=theApp.LoadIcon(IDI_ICON_VIDEO_

网格控件的简单实用

一,新建一个BCG工程CBCGPGridCtrlSingle,基于对话框. 二,CCBCGPGridCtrlSingleDlg类定义变量. CBCGPGridCtrl m_grid; 三,CCBCGPGridCtrlSingleDlg::OnInitDialog对网格控件进行初始化. CRect r(0,0,200,200); m_grid.Create(WS_CHILD, r, this, 1); m_grid.ShowWindow(SW_SHOW); m_grid.InsertColumn