本文描寫敘述了 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 函數中的局部變量,否則指針引用將出錯。
效果截圖例如以下:

