樹形控件CTreeCtrl的使用

樹形控件在界面編程中應用十分普遍,如在資源管理器中和樹形結構顯示書的目錄等,我們一步步研究樹形控件的使用。

在對話框界面上首先拖動創建一個樹,一般我們改變三個屬性:

Has Buttons顯示帶有”+”或”-“的小方框,表示某項能否被展開或已展開,默認爲選中,我們改爲選中。

Has Lines在父項與子項之間連線以清楚地顯示結構,默認爲選中,改爲選中。

Lines at root:在根部劃線,默認爲選中,改爲選中。

其餘根據需要,可以修改,如Always show slection,Edit labels

接下來就要按我們的需要顯示內容了,請看常用函數:

改變節點函數:

插入樹節點:HTREEITEM InsertItem(LPCTSTR lpszItem, int nImage,int nSelectedImage, HTREEITEM hParent = TVI_ROOT, HTREEITEM hInsertAfter = TVI_LAST)

lpszItem爲項的名稱,nImage爲位圖序列的索引,nSelectedImage爲選中項的位圖序列索引,hParent爲插入項的父項,如果爲TVI_ROOT或NULL,則插入樹的最高層,hInsertAfter取值爲TVI_FIRST,TVI_LAST,TVI_SORT。

刪除樹節點:BOOL DeleteItem(HTREEITEM hItem)

刪除所有樹節點:BOOL DeleteAllItems()

擴展節點:BOOL Expand(HTREEITEM hItem, UINT nCode),nCode是一個標誌,指定了函數執行的操作,可以是TVE_COLLAPSE(摺疊),TVE_COLLAPSERESET(摺疊並移走所有的子項),TVE_EXPAND(展開),TVE_TOGGLE(在展開和摺疊狀態之間反轉).

遍歷樹節點相關函數:

HTREEITEM GetRootItem() const;

HTREEITEM GetNextItem(HTREEITEM hItem, UINT nCode) const

HTREEITEM GetChildItem(HTREEITEM hItem) const

HTREEITEM GetNextSiblingItem(HTREEITEM hItem) const

HTREEITEM GetPrevSiblingItem(HTREEITEM hItem) const

HTREEITEM GetParentItem(HTREEITEM hItem) const

HTREEITEM GetFirstVisibleItem() const

HTREEITEM GetNextVisibleItem(HTREEITEM hItem) const

HTREEITEM GetPrevVisibleItem(HTREEITEM hItem) const

HTREEITEM GetLastVisibleItem() const

獲取設置節點標題:

CString GetItemText(_In_ HTREEITEM hItem) const;

BOOL SetItemText(_In_ HTREEITEM hItem, _In_z_ LPCTSTR lpszItem);

獲得或設置選擇的節點:

HTREEITEM GetSelectedItem() const

BOOL SelectItem(HTREEITEM hItem)

是否有子節點:BOOL ItemHasChildren(_In_ HTREEITEM hItem) const;

檢測點是否在樹節點區域:HTREEITEM HitTest(_In_ CPoint pt, _In_opt_ UINT* pFlags = NULL) const;

判斷是否是否最頂層節點用GetParentItem(hItem)== NULL

樹節點右鍵單擊菜單的實現,先重載右鍵單擊函數,然後分別實現相應菜單的功能:

void C**Dlg::OnNMRClickTree1(NMHDR *pNMHDR, LRESULT *pResult)

{

// TODO: 在此添加控件通知處理程序代碼

CPoint pt;

GetCursorPos(&pt);

m_Tree.ScreenToClient(&pt);

HTREEITEM hCurItem = m_Tree.GetSelectedItem();

//判斷右鍵的位置處是否是樹形控件的一個節點

//若有,則彈出右鍵菜單

HTREEITEM hItem = m_Tree.HitTest(pt);

if (hItem == NULL)

{

m_Tree.SelectItem(NULL);

}

else if (hCurItem != hItem)

{

m_Tree.SelectItem(hItem);

}

m_Tree.ClientToScreen(&pt);

CMenu menu;

if (menu.LoadMenuA(IDR_MENU1))

{

CMenu* pMenu = menu.GetSubMenu(1);

if (pMenu != NULL)

{

pMenu->TrackPopupMenu(TPM_LEFTALIGN, pt.x, pt.y, this);

pMenu->DestroyMenu();

*pResult = 1;

return;

}

}

*pResult = 0;

}

實現樹節點的多選和拖動需要派生一個新類,在此不再詳寫了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章