(一)樹控制的主要功能
樹控制和視(Tree Control&View)主要用來顯示具有一定層次結構的數據項,如資源管理器中的磁盤目錄等,以供用戶在其中進行各種選擇。樹控制中的每個數據項包括數據項名
稱的文本字符串和用于表示該數據項的圖像,每個數據項下面均可包含各種子項,整個結構就象目錄樹一樣。對于包含各種子項的數據項,可通過鼠標雙擊來展開或合攏,這可以
通過控制樹的不同風格來實現樹控制的不同顯示形態。這些風格主要包括:
TVS_HASLINES表示用連線來連接父項和它下面的各個子項,這可以使樹的顯示層次結構更加清晰,但在無父項的各子項之間并沒有連線;
TVS_LINESATROOT表示在無父項的各子項即根下面的各子項之間存在連線;
TVS_HASBUTTONS表示在帶有子項的父項前面增加一個帶“+”或“-”的按鈕,這使得用戶也可以通過單擊這個小按鈕來實現子項的展開和合攏,當存在子項時,按鈕的初始狀態
為“+”,當子項被展開時,按小按鈕由“+”變為“-”號,當子項合攏時,小按鈕由“-”變為“+”號,這一風格同樣對于根項無效,如果需要可通過組合TVS_LINESATROOT
風格來實現;
TVS_EDITLABELS表示允許讓用戶單擊具有輸入焦點的數據項來修改其名稱。
對于樹控制,MFC中也以兩種形式來封裝,即樹控制(CTREECTRL)和樹視(CTREEVIEW),來滿足用戶的不同需求,對于一般要求的用戶如在對話框中應用,使用樹控制比較方便,
而對于具有較高要求的用戶,在使用樹視時還具有視窗口的各種方便特性,可以更好地滿足文檔/視結構的要求。當在窗口中使用樹視時,樹視會占滿兩個窗口的客戶區域并自動
隨窗口的框架結構的調整而調整,并能夠很好地處理諸如菜單、加速鍵和工具條中的各種命令消息。在使用樹視時只要利用其成員函數CtreeView取得其一個引用,就可以象樹控制
一樣方便地應用:CtreeCtrl &treeCtrl = GetTreeCtrl()。
(二)樹控制的對象結構
1、樹控制的建立方法
CtreeCtrl&treeCtrl 建立樹控制對象結構
Create 建立樹控制并綁定對象
樹控制CTreeCtrl::Create的調用格式如下:
BOOL Create( DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID );
其中參數dwStyle用來確定樹控制的類型;rect用來確定樹控制的大小和位置;pParentWnd用來確定樹控制的父窗口,通用是一個對話框并且不能為NULL;nID用來確定樹控制的標
識。樹控制的風格可以是下列值的組合:
TVS_HASLINES 表示樹控制在各子項之間存在連線;
TVS_LINESATROOT 表示樹控制在根項之間存在連線;
TVS_HASBUTTONS 表示樹控制視在父項左側存在展開合攏控制按鈕;
TVS_EDITLABELS 表示可以控制鼠標單擊修改樹項的名稱;
TVS_SHOWSELALWAYS 表示選中項即使在窗口失去輸入焦點時仍然保持選中狀態;
TVS_DISABLEDRAGDROP表示禁止樹控制發送TVN_BEGINDRAG消息
2、樹控制的屬性類
樹控制屬性類包括取得樹控制中項數GetCount、取得樹控制中項相對于父項的偏移值GetIndent、取得樹控制圖像列表控制句柄GetImageList、設置樹控制圖像列表控制句柄
SetImageList、取得匹配下一個樹項GetNextItem、判斷給定樹項是否包含子項ItemHasChildren、取得樹項子項GetChildItem、取得下一個同屬樹項GetNextSiblingItem、取得前
一個同屬樹項GetPrevSiblingItem、取得父樹項GetParentItem、取得第一個可視樹項GetFirstVisibleItem、取得下一個可視樹項GetNextVisible Item、取得前一個可視的樹項
GetPrevVisibleItem、取得被選中的樹項GetSelectedItem、取得根樹項GetRootItem、取得樹項的屬性GetItem、設置樹項的屬性SetItem、取得樹項的狀態GetItemState、設置樹
項的狀態SetItemState、取得與樹項關聯圖像GetItemImage、設置與樹項關聯圖像SetItemImage、取得樹項文本GetItemText、設置樹項文本SetItemText和取得樹項編輯控制句柄
GetEditControl等。
3、樹控制的操作方法
樹控制的操作方法包括插入一個樹項InsertItem、刪除一個樹項DeleteItem、刪除所有樹項DeleteAllItems、展開或合攏樹項的子項Expand、選中特定樹項SelectItem、選擇一個
樹項作為第一個可視樹項SelectSetFirstVisible、編輯一個可視的樹項EditLabel和排序給定父樹項的子樹項SortChildren等。
(三)樹控制的數據結構
在使用樹控制時需要了解兩個個非常重要的數據結構TV_ITEM和TV_INSERTSTRUCT,前一個數據結構是用來表示樹控制的樹項信息,后一個數據結構是用來定義將樹項增加到數據控
制中所需要的數據內容。另外,還需要NM_TREEVIEW、TV_DISPINFO和TV_HITTESTINFO三個數據結構,這幾個數據結構的定義方法如下:
①基本數據項結構
typedef struct _TV_ITEM {
UINT mask; //結構成員有效性屏蔽位
HTREEITEM hItem; //數據項控制句柄
UINT state; //數據項狀態
UINT stateMask; //狀態有效性屏蔽位
LPSTR pszText; //數據項名稱字符串
int cchTextMax; //數據項名稱的最大長度
int iImage; //數據項圖標索引號
int iSelectedImage;//選中數據項圖標索引號
int cChildren; //子項標識
LPARAM lParam; //程序定義的32位數據
} TV_ITEM, FAR *LPTV_ITEM;
②插入樹項結構
typedef struct _TV_INSER TSTRUCT {
HTREEITEM hParent; //父項控制句柄
HTREEITEM hInsertAfter; //插入樹項的位置
TV_ITEM item; //數據項的結構
} TV_INSERTSTRUCT, FAR *LPTV_INSERTSTRUCT;
其中插入的位置如果是TVI_FIRST 或TVI_LAST ,則分別插入到樹控制的最前面或最后面,如果是TVI_SORT ,則插入的樹項自動插入到合適的位置。
③樹控制通知消息結構
typedef struct _NM_TREEVIEW {
NMHDR hdr; //通知消息句柄
UINT action; //通知消息標志
TV_ITEM itemOld; //原來的數據結構
TV_ITEM itemNew; //新的數據結構
POINT ptDrag; //拖動指針
} NM_TREEVIEW;
④取得或設置數據結構
typedef struct _TV_DISPINFO { tvdi
NMHDR hdr; //通知消息控制句柄
TV_ITEM item; //數據項結構
} TV_DISPINFO;
⑤指針測試數據結構
typedef struct _TVHITTESTINFO { tvhtst
POINT pt; //客戶區域屏幕坐標指針
UINT flags; //存放測試結果的變量
HTREEITEM hItem; //測試的數據項結構
} TV_HITTESTINFO, FAR *LPTV_HITTESTINFO;
其中flags測試結果可以是如下值:
TVHT_ABOVE 在客戶區域上面
TVHT_BELOW 在客戶區域下面
TVHT_NOWHERE 在客戶區域中并在最后一項下面
TVHT_ONITEM 在與樹項關聯的位圖或標簽內
TVHT_ONITEMBUTTON 在與樹項關聯的按鈕上
TVHT_ONITEMICON 在與樹項關聯的位圖上
TVHT_ONITEMINDENT 在與樹項關聯的聯線上
TVHT_ONITEMLABEL 在與樹項關聯的標簽上
TVHT_ONITEMRIGHT 在樹項的右側區域中
TVHT_ONITEMSTATEICON 在用戶定義的狀態圖標上
TVHT_TOLEFT 在客戶區域的左側
TVHT_TORIGHT 在客戶區域的右側
(四)樹控制的應用技巧示例
這里仍以基于對話框演示實例來具體介紹樹控制及其和圖像列表相結構的應用技巧:
通過“FILE->NEW->PROJECTS->MFC AppWizard(EXE)”建立名為VCTREE的工程,在建立過程中選擇基于對話框(Dialog based)的應用;將對話框中的默認控件刪除,并將所有對話
框屬性中的Language域設置為Chinese(P.R.C.),以使應用程序支持中文;建立兩個圖標IDI_PM和IDI_CJ,用來表示圖標的選中和非選中狀態,對于每個圖標都應建立32X32和16X16
兩種大小,以保證程序的需要;在對話框窗口中添加樹控制對象(TREE CONTROL),并設置五個按鈕“增加|刪除|查看|排序|關閉”,其對應標識分別如下: