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