MFC中CTreeCtrl類的一些基本用法

2021-04-19 10:55:28 字數 2658 閱讀 8143

最近做課程設計是用到了樹形控制項,原來對樹形控制項的用法基本都忘了,這次又重新整合了一下,以加深記憶。

樹形控制項可以用於樹形的結構,其中有乙個根接點(root)然後下面有許多子結點,而每個子結點上有允許有乙個或多個或沒有子結點。ctreectrl類封裝了樹形控制項的各種操作。在樹形控制項中每乙個結點都有乙個htreeitem控制代碼,這個控制代碼按我的理解其實就是一些十六進製制的數,就是用來標識的id。但是我們通常新增到樹形結構的結點都是一些圖示或者字串,這時可以呼叫:

cstring ctreectrl::getitemtext(htreeitem hitem);

來獲得控制代碼為hitem的顯示字元。同理:

bool ctreectrl::setitemtext( htreeitem hitem, lpctstr lpszitem );

來將控制代碼為hitem的顯示字元設定為lpszitem 。

一般我們建立了乙個樹形控制項之後就要對這個控制項新增結點,ctreectrl類提供了乙個函式:

htreeitem insertitem( lpctstr lpszitem, htreeitem hparent = tvi_root, htreeitem hinsertafter = tvi_last );

來幫助我們,這個函式的返回值是新新增結點的htreeitem控制代碼,函式的引數lpszitem是要新增結點的顯示字元,hparent代表父結點的控制代碼,預設為根節點,當前新增的結點會排在hinsertafter表示的結點的後面,預設是新增在最後。利用這個方法我們可以遞迴新增無窮的結點。下面的**會建立乙個如下形式的樹形結構:

+--- parent1

+--- child1_1

+--- child1_2

+--- child1_3

+--- parent2

+--- parent3

/*假設m_tree為乙個ctreectrl物件,而且該視窗已經建立*/

htreeitem hitem,hsubitem;

hitem = m_tree.insertitem("parent1",tvi_root);在根結點上新增parent1

hsubitem = m_tree.insertitem("child1_1",hitem);//在parent1上新增乙個子結點

hsubitem = m_tree.insertitem("child1_2",hitem,hsubitem);//在parent1上新增乙個子結點,排在child1_1後面

hsubitem = m_tree.insertitem("child1_3",hitem,hsubitem);

hitem = m_tree.insertitem("parent2",tvi_root,hitem);   

hitem = m_tree.insertitem("parent3",tvi_root,hitem); 

此外如果想遍歷樹可以使用下面的函式:

htreeitem getrootitem( );得到根結點。

htreeitem getchilditem( htreeitem hitem );得到子結點。

htreeitem getprevsiblingitem/getnextsiblingitem( htreeitem hitem );得到指明結點的上/下乙個兄弟結點。

htreeitem getparentitem( htreeitem hitem );得到父結點。

我的程式中利用了這些函式新增了乙個三層結構的樹,其中考慮了一些結點重複(重複的結點不新增)的問題,發現ctreectrl中並沒有合適的函式可以使用,於是就自己寫了乙個,**如下:

bool istreesubitemexist(ctreectrl* ptree,htreeitem hparent,cstring szcurrent)

if(hchild==null)

return false;

else

return true;

}這個函式用來確定ptree中控制代碼為hparent的結點是否存在顯示字元為szcurrent的結點,若存在返回真,不存在返回假。

在這個函式的基礎上,我又寫了乙個新增的完整的**,如下:

void cmyview::updatetreeviewctrl()               

pnextdevice=pnextdevice->m_nextdevice;

}pnextdevice=m_pfirst->m_nextdevice;

while(pnextdevice!=null)

if(hitem!=null)

}pnextdevice=pnextdevice->m_nextdevice;

}pnextdevice=m_pfirst->m_nextdevice;

while(pnextdevice!=null)

}hsubsubitem=pmytree->getnextsiblingitem(hsubsubitem);

}hitem=pmytree->getnextsiblingitem(hitem);

}pnextdevice=pnextdevice->m_nextdevice;}}

這個函式基本上實現我的目標,但是我覺得在演算法上不是很有效率,由於**很簡單我也不介紹了,等有了改進的方法我會再來更新的。

ctreectrl還有很多其他的豐富的方法目前此次也沒有用到,就只介紹我用到的這些吧!以後用到之後再來補上!

MFC中CTreeCtrl類的一些基本用法

mfc中ctreectrl類的一些基本用法 hitem m tree.insertitem parent2 tvi root,hitem hitem m tree.insertitem parent3 tvi root,hitem 此外如果想遍歷樹可以使用下面的函式 htreeitem getroo...

MFC 樹控制項CTreeCtrl

常用屬性設定 屬性 含義 has buttons true 有展開按鈕 has lines true 有展開線 lines at root true 有根節點 常用介面 介面 功能 獲取應用程式物件指標 載入自定義圖示 cimagelist create 建立影象列表 cimagelist add ...

MFC樹控制項CTreeCtrl

屬性 含義 has buttons true 有展開按鈕 has lines true 有展開線 lines at root true 有根節點 介面 功能 獲取應用程式物件指標 載入自定義圖示 cimagelist create 建立影象列表 cimagelist add 影象列表追加圖示 ctr...