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