2009-12-30 20:56:38
樹形控件是一種可以分級顯示項目列表的窗口,其所含項目以相互關(guān)聯(lián)的方式顯示在控件中,通過點擊位于某個層次的項目 節(jié)點可以展開下一層次中從屬于該節(jié)點的所有項目。樹形控件非常適合于管理那些層次較多且相互間隸屬關(guān)系較為清晰的項目元素。在MFC中,由 CTreeCtrl類提供了對樹形控件的功能支持。
在用Create()創(chuàng)建了一個樹形控件后可以用SetImageList()函 數(shù)為其設(shè)置一個圖象列表,這樣就可以在樹形控件中為各個層次的項目設(shè)置圖標。通過InsertItem()函數(shù)可以為其添加數(shù)據(jù)項,返回的 HTREEITEM類型的句柄唯一標識了此添加的項目。該句柄應(yīng)當(dāng)妥善保管,只有通過該句柄才能為此項目繼續(xù)添加子項目。如果在創(chuàng)建子窗口時指定父窗口句 柄為NULL,則將直接在根目錄創(chuàng)建項目。下面這段代碼將通過上述函數(shù)創(chuàng)建一個樹形控件并向其添加二個層次的項目:
// 創(chuàng)建一個樹形控件
m_ctrTreeCtrl.Create(WS_VISIBLE | WS_CHILD | WS_BORDER | TVS_LINESATROOT | TVS_HASLINES | TVS_HASBUTTONS | TVS_EDITLABELS, CRect(500, 50, 670, 200),this, IDC_TREE1);
……
TV_ITEM tvItem;
TV_INSERTSTRUCT tvInsert;
tvItem.mask = TVIF_TEXT; // 指定pszText成員可用
tvItem.pszText = "Item0"; // 根項目顯示的字符
tvInsert.hParent = TVI_ROOT; // 指定父句柄
tvInsert.item = tvItem; // 指定TV_ITEM結(jié)構(gòu)對象
tvInsert.hInsertAfter = TVI_LAST; // 項目插入方式
// 創(chuàng)建根項目,當(dāng)前項目句柄保存于hItem0中
HTREEITEM hItem0 = m_ctrTreeCtrl.InsertItem(&tvInsert);
……
// 在根項目下繼續(xù)創(chuàng)建第二層項目
tvItem.mask = TVIF_TEXT;
tvItem.pszText = "SubItem0";
tvInsert.hParent = hItem0;
tvInsert.item = tvItem;
tvInsert.hInsertAfter = TVI_LAST;
HTREEITEM hItem3 = m_ctrTreeCtrl.InsertItem(&tvInsert);
作為同用戶的接口,樹形控件將在不同的動作下發(fā)出各種通知消息,可以在控件窗口的消息映射中添加ON_NOTIFY_REFLECT宏或是在控件所在父窗口的消息映射中添加ON_NOTIFY宏來為每一個通知消息指定處理函數(shù)。
樹形控件中的任何一個項目均可以擁有一個子項目列表,此列表可以隨時處于展開或縮起狀態(tài)。當(dāng)處于展開狀態(tài)時,對應(yīng)的子項目將以縮進方式顯示在父項目下; 當(dāng)處于縮起狀態(tài)時,子項目將不顯示。當(dāng)用戶在雙擊父項目時,相應(yīng)的子項目列表將自動在展開與縮起狀態(tài)切換。在子項目列表狀態(tài)發(fā)生改變時和狀態(tài)改變完成后樹 形控件將分別發(fā)出TVN_ITEMEXPANDING和 TVN_ITEMEXPANDED通知消息。關(guān)于其它的通知消息及其具體含義可參見下表:
通知消息
消息說明
TVN_BEGINDRAG
開始拖拽操作
TVN_BEGINLABELEDIT
開始編輯標簽
TVN_BEGINRDRAG
開始鼠標右鍵拖拽操作
TVN_DELETEITEM
刪除一個指定的項目
TVN_ENDLABELEDIT
結(jié)束編輯標簽
TVN_GETDISPINFO
獲取一個項目的顯示信息
TVN_ITEMEXPANDED
子項目列表被展開或收起
TVN_ITEMEXPANDING
子項目列表正將展開或收起
TVN_KEYDOWN
鍵盤事件
TVN_SELCHANGED
項目的選擇發(fā)生改變
TVN_SELCHANGING
項目的選擇將要發(fā)生改變
TVN_SETDISPINFO
通知更新一個項目的信息