MFC实例【13】Tree Control树形控件实例

1.、创建一个基于对话框的MFC工程,名称设置为“MFCTree”。

2.、在自动生成的对话框模板MFCTreeDlg中,删除“TODO: Place dialog controls here.”静态文本框、“OK”按钮和“Cancel”按钮。添加一个Tree Control控件,ID设置为IDC_WEB_TREE,属性Has Buttons、Has Lines和Lines At Root都设为True,为了在鼠标划过某个节点时显示提示信息还需要将Info Tip属性设为True。再添加一个静态文本框和一个编辑框,静态文本框的Caption属性设为“您选择的节点:”,编辑框的ID设为IDC_ITEM_SEL_EDIT,Read Only属性设为True。此时的对话框模板如下图:

3、导入需要为树形控件的节点添加的图标。鸡啄米在这里找了三个128x128的Icon图标,保存到工程的res目录下。然后在Resource View资源视图中,右键点击Icon节点,在右键菜单中选择“Add Resource...”,弹出“Add Resource”对话框,再从左边“Resource type”列表中选择“Icon”,点击右边的“Import...”按钮,就可以选择三个图标文件进行导入了。导入成功后,分别修改它们ID为IDI_WEB_ICON、IDI_CATALOG_ICON和IDI_ARTICLE_ICON。

4、为树形控件IDC_WEB_TREE添加CTreeCtrl类型的控件变量m_webTree。并在MFCTreeDlg.h文件中为MFCTreeDlg类添加成员对象:CImageList m_imageList;。

5.、在对话框初始化时,我们在树形控件中添加网站的树形结构,那么需要修改OnInitDialog()函数为:

BOOL CMFCTreeDlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	// 将“关于...”菜单项添加到系统菜单中。

	// IDM_ABOUTBOX 必须在系统命令范围内。
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != nullptr)
	{
		BOOL bNameValid;
		CString strAboutMenu;
		bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
		ASSERT(bNameValid);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// 设置此对话框的图标。  当应用程序主窗口不是对话框时,框架将自动
	//  执行此操作
	SetIcon(m_hIcon, TRUE);			// 设置大图标
	SetIcon(m_hIcon, FALSE);		// 设置小图标

	// TODO: 在此添加额外的初始化代码
	HICON hIcon[3];      // 图标句柄数组   
	HTREEITEM hRoot;     // 树的根节点的句柄
	HTREEITEM hCataItem; // 可表示任一分类节点的句柄   
	HTREEITEM hArtItem;  // 可表示任一文章节点的句柄   

	// 加载三个图标,并将它们的句柄保存到数组   
	hIcon[0] = theApp.LoadIcon(IDI_WEB_ICON);
	hIcon[1] = theApp.LoadIcon(IDI_CATALOG_ICON);
	hIcon[2] = theApp.LoadIcon(IDI_ARTICLE_ICON);

	// 创建图像序列CImageList对象   
	m_imageList.Create(32, 32, ILC_COLOR32, 3, 3);
	// 将三个图标添加到图像序列   
	for (int i = 0; i < 3; i++)
	{
		m_imageList.Add(hIcon[i]);
	}

	// 为树形控件设置图像序列   
	m_webTree.SetImageList(&m_imageList, TVSIL_NORMAL);

	// 插入根节点   
	hRoot = m_webTree.InsertItem(_T("个人网站"), 0, 0, TVI_ROOT);
	// 在根节点下插入子节点   
	hCataItem = m_webTree.InsertItem(_T("IT互联网"), 1, 1, hRoot, TVI_LAST);
	// 为“IT互联网”节点添加附加的编号数据,在鼠标划过该节点时显示   
	m_webTree.SetItemData(hCataItem, 1);
	// 在“IT互联网”节点下插入子节点   
	hArtItem = m_webTree.InsertItem(_T("百度文章1"), 2, 2, hCataItem, TVI_LAST);
	// 为“百度文章1”节点添加附加的编号数据,在鼠标划过该节点时显示   
	m_webTree.SetItemData(hArtItem, 2);
	// 在“IT互联网”节点下插入另一子节点   
	hArtItem = m_webTree.InsertItem(_T("谷歌文章2"), 2, 2, hCataItem, TVI_LAST);
	// 为“谷歌文章2”节点添加附加的编号数据,在鼠标划过该节点时显示   
	m_webTree.SetItemData(hArtItem, 3);
	// 在根节点下插入第二个子节点   
	hCataItem = m_webTree.InsertItem(_T("数码生活"), 1, 1, hRoot, TVI_LAST);
	// 为“数码生活”节点添加附加的编号数据,在鼠标划过该节点时显示   
	m_webTree.SetItemData(hCataItem, 4);
	// 在“数码生活”节点下插入子节点   
	hArtItem = m_webTree.InsertItem(_T("智能手机文章1"), 2, 2, hCataItem, TVI_LAST);
	// 为“智能手机文章1”节点添加附加的编号数据,在鼠标划过该节点时显示   
	m_webTree.SetItemData(hArtItem, 5);
	// 在“数码生活”节点下插入另一子节点   
	hArtItem = m_webTree.InsertItem(_T("平板电脑文章2"), 2, 2, hCataItem, TVI_LAST);
	// 为“平板电脑文章2”节点添加附加的编号数据,在鼠标划过该节点时显示   
	m_webTree.SetItemData(hArtItem, 6);


	CInitDlg();
	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

6、我们希望在选中节点改变时,将最新的选择项实时显示到编辑框中,那么可以响应TVN_SELCHANGED通知消息。为树形控件IDC_WEB_TREE的通知消息TVN_SELCHANGED添加消息处理函数MFCTreeDlg::OnTvnSelchangedWebTree,并修改函数体如下:

7、还有一个功能需要实现,那就是鼠标划过除根节点外的某个树节点时,显示相应的Tip提示信息,本实例中提示信息为节点的编号。这需要响应TVN_GETINFOTIP通知消息。为树形控件IDC_WEB_TREE的通知消息TVN_GETINFOTIP添加消息处理函数MFCTreeDlg::OnTvnGetInfoTipWebTree,并修改函数体如下:

//此函数功能未能弹出消息
void CMFCTreeDlg::OnTvnSetdispinfoWebTree(NMHDR *pNMHDR, LRESULT *pResult)
{
	LPNMTVDISPINFO pTVDispInfo = reinterpret_cast<LPNMTVDISPINFO>(pNMHDR);
	// TODO: 在此添加控件通知处理程序代码
	
	NMTVGETINFOTIP* pTVTipInfo = (NMTVGETINFOTIP*)pNMHDR;   // 将传入的pNMHDR转换为NMTVGETINFOTIP指针类型   
	HTREEITEM hRoot = m_webTree.GetRootItem();      // 获取树的根节点   
	CString strText;     // 每个树节点的提示信息   

	if (pTVTipInfo->hItem == hRoot)
	{
		// 如果鼠标划过的节点是根节点,则提示信息为空   
		strText = _T("");
	}
	else
	{
		// 如果鼠标划过的节点不是根节点,则将该节点的附加32位数据格式化为字符串   
		strText.Format(_T("%d"), pTVTipInfo->lParam);
	}

	// 将strText字符串拷贝到pTVTipInfo结构体变量的pszText成员中,这样就能显示内容为strText的提示信息   
	wcscpy_s(pTVTipInfo->pszText,sizeof(pTVTipInfo->pszText), strText);
	*pResult = 0;
}

补充:

1、循环添加树控件信息:

void CMFCTreeDlg::CInitDlg()
{
	// TODO: 在此处添加实现代码.

	HTREEITEM hRoot[MAX_PATH];     // 树的根节点的句柄
	HTREEITEM hCataItem[MAX_PATH]; // 可表示任一分类节点的句柄   
	HTREEITEM hArtItem[MAX_PATH];  // 可表示任一文章节点的句柄   

	// 插入根节点
	int i=0;
	while(i<3)
	{
		hRoot[i] = m_webTree.InsertItem(_T("个人网站备份"), 0, 0, TVI_ROOT);
		// 在根节点下插入子节点   
		hCataItem[i] = m_webTree.InsertItem(_T("IT互联网"), 1, 1, hRoot[i], TVI_LAST);
		// 为“IT互联网”节点添加附加的编号数据,在鼠标划过该节点时显示   
		m_webTree.SetItemData(hCataItem[i], 1);
		// 在“IT互联网”节点下插入子节点   
		hArtItem[i] = m_webTree.InsertItem(_T("百度文章1"), 2, 2, hCataItem[i], TVI_LAST);
		// 为“百度文章1”节点添加附加的编号数据,在鼠标划过该节点时显示   
		m_webTree.SetItemData(hArtItem[i], 2);
		// 在“IT互联网”节点下插入另一子节点,2代表默认图标,1 代表点击后的图标  
		hArtItem[i] = m_webTree.InsertItem(_T("谷歌文章2"), 2, 1, hCataItem[i], TVI_LAST);
		// 为“谷歌文章2”节点添加附加的编号数据,在鼠标划过该节点时显示   
		m_webTree.SetItemData(hArtItem[i], 3);
		i++;
	}
	
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值