修改設定樣式:
m_treectrl.modifystyle(0,tvs_hasbuttons | tvs_linesatroot | tvs_haslines);
樹形控制項可以用於樹形的結構,其中有乙個根接點(root)然後下面有許多子結點,而每個子結點上有允許有乙個或多個或沒有子結點。mfc中使用ctreectrl類來封裝樹形控制項的各種操作。通過呼叫
bool create( dword dwstyle, const rect& rect, cwnd* pparentwnd, uint nid );建立乙個視窗,dwstyle中可以使用以下一些樹形控制項的專用風格:
tvs_haslines 在父/子結點之間繪製連線
tvs_linesatroot 在根/子結點之間繪製連線
tvs_hasbuttons 在每乙個結點前新增乙個按鈕,用於表示當前結點是否已被展開
tvs_editlabels 結點的顯示字元可以被編輯
tvs_showselalways 在失去焦點時也顯示當前選中的結點
tvs_disabledragdrop 不允許drag/drop
tvs_notooltips 不使用tooltip顯示結點的顯示字元
在樹形控制項中每乙個結點都有乙個控制代碼(htreeitem),同時新增結點時必須提供的引數是該結點的父結點控制代碼,(其中根root結點只有乙個,既不可以新增也不可以刪除)利用
htreeitem insertitem( lpctstr lpszitem, htreeitem hparent = tvi_root, htreeitem hinsertafter = tvi_last );可以新增乙個結點,pszitem為顯示的字元,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);
如果你希望在每個結點前新增乙個小圖示,就必需先呼叫cimagelist* setimagelist( cimagelist * pimagelist, int nimagelisttype );指明當前所使用的imagelist,nimagelisttype為tvsil_normal。在呼叫完成後控制項中使用以設定的imagelist中為準。然後呼叫
htreeitem insertitem( lpctstr lpszitem, int nimage, int nselectedimage, htreeitem hparent = tvi_root, htreeitem hinsertafter = tvi_last);新增結點,nimage為結點沒被選中時所使用序號,nselectedimage為結點被選中時所使用序號。下面的**演示了imagelist的設定。
/*m_list 為cimagelist物件
idb_tree 為16*(16*4)的點陣圖,每個為16*16共4個圖示*/
m_list.create(idb_tree,16,4,rgb(0,0,0));
m_tree.setimagelist(&m_list,tvsil_normal);
m_tree.insertitem("parent1",0,1);//新增,選中時顯示圖示1,未選中時顯示圖示0
此外ctreectrl還提供了一些函式用於得到/修改控制項的狀態。
htreeitem getselecteditem( );將返回當前選中的結點的控制代碼。bool selectitem( htreeitem hitem );將選中指明結點。
bool getitemimage( htreeitem hitem, int& nimage, int& nselectedimage ) / bool setitemimage( htreeitem hitem, int nimage, int nselectedimage )用於得到/修改某結點所使用圖示索引。
cstring getitemtext( htreeitem hitem ) /bool setitemtext( htreeitem hitem, lpctstr lpszitem );用於得到/修改某一結點的顯示字元。
bool deleteitem( htreeitem hitem );用於刪除某一結點,bool deleteallitems( );將刪除所有結點。
此外如果想遍歷樹可以使用下面的函式:
htreeitem getrootitem( );得到根結點。
htreeitem getchilditem( htreeitem hitem );得到子結點。
htreeitem getprevsiblingitem/getnextsiblingitem( htreeitem hitem );得到指明結點的上/下乙個兄弟結點。
htreeitem getparentitem( htreeitem hitem );得到父結點。
樹形控制項的訊息對映使用on_notify巨集,形式如同:on_notify( wnotifycode, id, memberfxn ),wnotifycode為通知**,id為產生該訊息的視窗id,memberfxn為處理函式,函式的原型如同void on***tree(nmhdr* pnmhdr, lresult* presult),其中pnmhdr為一資料結構,在具體使用時需要轉換成其他型別的結構。對於樹形控制項可能取值和對應的資料結構為:
tvn_selchanged 在所選中的結點發生改變後傳送,所用結構:nmtreeview
tvn_itemexpanded 在某結點被展開後傳送,所用結構:nmtreeview
tvn_beginlabeledit 在開始編輯結點字元時傳送,所用結構:nmtvdispinfo
tvn_endlabeledit 在結束編輯結點字元時傳送,所用結構:nmtvdispinfo
tvn_getdispinfo 在需要得到某結點資訊時傳送,(如得到結點的顯示字元)所用結構:nmtvdispinfo
關於on_notify有很多內容,將在以後的內容中進行詳細講解。
關於動態提供結點所顯示的字元:首先你在新增結點時需要指明lpszitem引數為:lpstr_textcallback。在控制項顯示該結點時會通過傳送tvn_getdispinfo來取得所需要的字元,在處理該訊息時先將引數pnmhdr轉換為lpnmtvdispinfo,然後填充其中item.psztext。但是我們通過什麼來知道該結點所對應的資訊呢,我的做法是在新增結點後設定其lparam引數,然後在提供資訊時利用該引數來查詢所對應的資訊。下面的**說明了這種方法:
char szout[8][3]=;
//新增結點
htreeitem hitem = m_tree.insertitem(lpstr_textcallback,...)
m_tree.setitemdata(hitem, 0 );
hitem = m_tree.insertitem(lpstr_textcallback,...)
m_tree.setitemdata(hitem, 1 );
//處理訊息
void cparentwnd::ongetdispinfotree(nmhdr* pnmhdr, lresult* presult)
關於編輯結點的顯示字元:首先需要設定樹形控制項的tvs_editlabels風格,在開始編輯時該控制項將會傳送tvn_beginlabeledit,你可以通過在處理函式中返回true來取消接下來的編輯,在編輯完成後會傳送tvn_endlabeledit,在處理該訊息時需要將引數pnmhdr轉換為lpnmtvdispinfo,然後通過其中的item.psztext得到編輯後的字元,並重置顯示字元。如果編輯在中途中取消該變數為null。下面的**說明如何處理這些訊息:
//處理訊息 tvn_beginlabeledit
void cparentwnd::onbeginedittree(nmhdr* pnmhdr, lresult* presult)
//處理訊息 tvn_beginlabeledit
void cparentwnd::onbeginedittree(nmhdr* pnmhdr, lresult* presult)
上面講述的方法所進行的訊息對映必須在父視窗中進行(同樣wm_notify的所有訊息都需要在父視窗中處理)。
VC中樹形控制項(CTreeCtrl)的使用
樹形控制項可以用於樹形的結構,其中有乙個根接點 root 然後下面有許多子結點,而每個子結點上有允許有乙個或多個或沒有子結點。mfc中使用ctreectrl類來封裝樹形控制項的各種操作。通過呼叫 bool create dword dwstyle,const rect rect,cwnd ppare...
CTreeCtrl控制項
在這裡,你可以獲得以下資訊 1.ctreectrl 樣式及設定 2.擴充套件樣式設定 3.資料插入 ctreectrl控制項 cobject ccmdtarget cwnd ctreectrl 1.ctreectrl 樣式及設定 long lstyle lstyle getwindowlong m ...
CTreeCtrl 控制項的用法
樹形控制項在介面程式設計中應用十分普遍,如在資源管理器中和樹形結構顯示書的目錄等,我們一步步研究樹形控制項的使用。在對話方塊介面上首先拖動建立乙個樹,一般我們改變三個屬性 has buttons顯示帶有 或 的小方框,表示某項能否被展開或已展開,預設為選中,我們改為選中。has lines在父項與子...