天天看點

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 控件(一):簡單使用