MFC中CImageList(圖形列表控件)和CTreeCtrl(樹形列表控件)的簡單用法

作者:獨釣寒江 
來源:草屋&拾荒 - 獨釣寒江的技術博客 

 

首先是CImageList控件,用來保存一組相同大小的圖標或位圖,它沒有圖形顯示界面,主要用途是爲其它控件提供圖形列表。可以通過索引訪問圖標或位圖。CImageList常用的函數有:

 

函數 說明
Create 創建一個CImageList控件
GetImageCount 獲取圖像的數目
GetImageInfo 獲取圖像信息
Add 添加圖像到圖像列表控件
Remove 從列表中刪除圖像
Replace 替換列表中指定的圖像

例如:

CImageList m_imageList;

//創建CImageList對象 
m_imageList.Create(16, 16, ILC_COLOR8, 0, 4); 
//加載圖標 
m_imageList.Add(AfxGetApp()->LoadIcon(IDI_ICON_ROOT));

 

    然後該CTreeCtrl了,這是一個樹形列表控件,提供了分層級結構顯示數據的功能。這個控件有可視化的界面,可以通過界面編輯器進行創建,只需要拉到界面上即可;同樣也可以通過Create函數創建一個樹形列表控件,由於這種方法通常不用,這裏不再贅言。另外該控件還有很多樹形,如Has Button、Has Line等,可以在界面編輯器的屬性中查看並設置。

    樹形控件有兩個非常重要的數據結構:TV_ITEM和TV_INSERTSTRUCT。前者用來描述一個樹節點的信息;後者描述要插入樹時所需的信息。結構如下:

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位數據TVIF_PARAM 
} TV_ITEM, FAR *LPTV_ITEM;

 

typedef struct _TV_INSER    TSTRUCT 

    HTREEITEM hParent;         //父項控制句柄 
    HTREEITEM hInsertAfter;    //插入樹項的位置 
    TV_ITEM   item;             //數據項的結構 
} TV_INSERTSTRUCT, FAR *LPTV_INSERTSTRUCT;

 

    使用CImageList可以方便的爲CTreeCtrl提供圖標。首先設置樹形控件的圖形列表:

m_treeStruct.SetImageList(&m_imageList,TVSIL_NORMAL);

    然後在添加樹形列表節點時可以設置節點的選中時圖標索引和未選中時的圖標索引。如果沒有設置,則數據結構會默認爲0。數據結構爲上面的TV_ITEM。

    向樹形控件中添加根節點

    添加根節點是比較麻煩的,具體代碼如下:

TVINSERTSTRUCT tvInsert;                        //定義一個插入結構 
HTREEITEM hParent;                                //用來保存插入的位置 
tvInsert.hParent = NULL;                        //設置父節點爲空 
tvInsert.hInsertAfter = NULL;                    //設置之前的節點同樣爲空 
tvInsert.item.mask = TVIF_TEXT;                    //設置掩碼 
tvInsert.item.pszText = _T("公司");                //要顯示的文字爲“公司” 
hParent = m_treeStruct.InsertItem(&tvInsert);    //插入樹形結構中,並返回插入的位置

 

    有了父節點hParent ,再要插入子節點就方便了:

//添加第一級項目"技術部" 
//參數列表:顯示的文字、已選擇的圖標索引、未選擇的圖標索引、父節點的HTREEITEM值 
HTREEITEM h1 = m_treeStruct.InsertItem("技術部",1,2,hParent);

//添加第一級項目"管理學院"下的子項目,即第二級 
m_treeStruct.InsertItem("ERP組",3,4,h1); 
m_treeStruct.InsertItem("UI組",3,4,h1); 
m_treeStruct.InsertItem("核心研發組",3,4,h1);

//添加其他第一級項目 
m_treeStruct.InsertItem("銷售部",1,2,hParent);

 

    展開樹節點:

//展開第一級項目 
m_treeStruct.Expand(hParent,TVE_EXPAND);

 

    向選中節點添加子節點:

//獲取樹形控件選擇的項目 
HTREEITEM hItem = m_treeStruct.GetSelectedItem(); 
//獲取選擇項目的子項目圖像的索引、子項目選擇後的圖像索引, 
//以便設置新添加的項目索引 
int index,selindex; 
m_treeStruct.GetItemImage(m_treeStruct.GetChildItem(hItem),index,selindex); 
//插入新的子項目到選擇的項目下 
m_treeStruct.InsertItem(m_strItem,index,selindex,hItem); 
//展開選擇的項目,以便查看新增加的子項 
m_treeStruct.Expand(hItem,TVE_EXPAND);

    刪除選中節點:

//獲取樹形控件選擇的項目 
HTREEITEM hItem = m_treeStruct.GetSelectedItem(); 
//刪除選擇的項目以及其下的所有子項 
m_treeStruct.DeleteItem(hItem);

 

發佈了34 篇原創文章 · 獲贊 3 · 訪問量 18萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章