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 函數中的局部變量,否則指針引用將出錯。


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





免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM