ASSERT(pmyTreeCtrl-> GetImageList(TVSIL_NORMAL) == NULL);
pmyTreeCtrl-> SetImageList(pmyImageList, TVSIL_NORMAL);
ASSERT(pmyTreeCtrl-> GetImageList(TVSIL_NORMAL) == pmyImageList);
段
1.CImageList myImageList;
2.CImageList::Create
3.CTreeCtrl::SetImageList:
CImageList* SetImageList( CImageList * pImageList, int nImageListType );
段
.h:
HTREEITEM m_hRootItem; //
CImageList MyImageList; //
.cpp
// Create an imagelist for the tree control.
MyImageList.Create( 20, 20, ILC_COLOR24, 2, 1 );
// Had created the imagelist(MyImageList) for the tree control in OnInitDialog.
CBitmap bmImage, bmSelectedImage;
bmImage.LoadBitmap( "NORMALIMAGE " );
bmSelectedImage.LoadBitmap( "SELECTIMAGE " );
int iNo = MyImageList.Add( bmImage.FromHandle( (HBITMAP)(bmImage) ), RGB( 0, 0, 0) );
int iNoSelect = MyImageList.Add( bmSelectedImage.FromHandle( (HBITMAP)(bmSelectedImage) ),
RGB( 0, 0, 0) );
bmImage.DeleteObject();
bmSelectedImage.DeleteObject();
TV_ITEM TreeItem;
TV_INSERTSTRUCT Item;
TreeItem.mask = TVIF_TEXT|TVIF_PARAM|TVIF_IMAGE|TVIF_SELECTEDIMAGE;
TreeItem.iImage = iNo;
TreeItem.iSelectedImage = iNoSelect;
二法
當然有方法了,你看下面的代碼就知道了。
m_img.Create( GetSystemMetrics(SM_CXSMICON),
GetSystemMetrics(SM_CYSMICON),
ILC_COLOR24, 50, 50);
m_img.SetBkColor( GetSysColor(COLOR_WINDOW) );
m_img.Add(ExtractIcon( AfxGetApp()-> m_hInstance, "shell32.dll ", 6));
m_img.Add(ExtractIcon( AfxGetApp()-> m_hInstance, "shell32.dll ", 3));
m_img.Add(ExtractIcon( AfxGetApp()-> m_hInstance, "shell32.dll ", 4));
m_img.Add(ExtractIcon( AfxGetApp()-> m_hInstance, "shell32.dll ", 8));
m_img.Add(ExtractIcon( AfxGetApp()-> m_hInstance, "shell32.dll ", 11));
m_img.Add(ExtractIcon( AfxGetApp()-> m_hInstance, "shell32.dll ", 9));
m_img.Add(ExtractIcon( AfxGetApp()-> m_hInstance, "shell32.dll ", 15));
m_dirTree.SetImageList(&m_img,TVSIL_NORMAL);
其中: CImageList m_img;
CTreeCtrl m_dirTree;
這個是我做的一個關於得到系統所有目錄滴例子中一段代碼,呵呵……(使用的圖標全部是系統圖標)
三法
圖標少的話,可以把所有圖標做成一個bmp,然後loadbitmap,用索引操作.
或者:
CBitmap bmp;
bmp.LoadBitmap(IDB_BMP1);
...
這裏把所有圖標加入imagelist
m_treeList.SetImageList(&m_imageList, TVSIL_NORMAL);
四法
在MFC中應用CTreeCtrl控件的技巧
首先,我們要創建一個基本對話框的MFC工程MFC_TreeCRTL。然後在資源視圖中插入兩個Dialog,ID分別爲IDD_DIALOG11和IDD_DIALOG211,都更改Style屬性爲Child,Border屬性爲None,爲它們建立兩個類,分別命名爲Cdialog11和Cdialog211,並在MFC_TreeCRTLDlg.CPP文件中包含dialog11.h和dialog211.h兩個頭文件。再導入幾個資源圖標作爲樹形控件節點的圖標及裝飾面板。最後在主面板上添加一個CTreeCtrl控件,ID爲默認,並在ClassWizard中添加它的一個變量,命名爲m_mytree。
接着,我們進行具體代碼編寫。
我們必須在CMFC_TreeCRTLDlg 類中加入這些變量和函數
CDialog * m_treePages[2];
CString node_name;
BOOL InitMytree();
我們還要在CMFC_TreeCRTLDlg 類的構造函數中爲m_treePages[2]分配空間,m_treePages[0]=new Cdialog11; m_treePages[1]=new Cdialog211;
InitMytree()函數是 m_mytree 的初始化過程
BOOL CMFC_TreeCRTLDlg::InitMytree()
{
//節點的圖標
int i=0;
int i_count=2;
//載入圖標
HICON icon[4];
icon[0]=AfxGetApp()->LoadIcon (IDI_ICON6);
icon[1]=AfxGetApp()->LoadIcon (IDI_ICON7);
//創建圖像列表控件
CImageList *m_imagelist=new CImageList;
m_imagelist->Create(16,16,0,7,7);
m_imagelist->SetBkColor (RGB(255,255,255));
for(int n=0;n<i_count;n++)
{
m_imagelist->Add(icon[n]); //把圖標載入圖像列表控件
}
m_mytree.SetImageList(m_imagelist,TVSIL_NORMAL); //爲m_mytree設置一個圖像列表,使CtreeCtrl的節點顯示不同的圖標
m_mytree.SetBkColor(RGB(0,250,255));//設置m_mytree的背景色
//創建節點
//父節點
HTREEITEM root0=m_mytree.InsertItem("Dialog1",0,1,TVI_ROOT,TVI_LAST);
HTREEITEM root1=m_mytree.InsertItem("Dialog2",0,1,TVI_ROOT,TVI_LAST);
//一層子節點
HTREEITEM sub_son0=m_mytree.InsertItem("Dialog 1-1",0,1,root0,TVI_LAST);
HTREEITEM sub_son1=m_mytree.InsertItem("Dialog 2-1",0,1,root1,TVI_LAST);
//二層孫子節點
HTREEITEM sub_m_son0=m_mytree.InsertItem("Dialog 2-1-1",0,1,sub_son1,TVI_LAST);
//建立節點對應的Dialog
m_treePages[0]->Create(IDD_DIALOG11,this);
m_treePages[1]->Create(IDD_DIALOG211,this);
m_treePages[0]->ShowWindow(SW_SHOW);
m_treePages[1]->ShowWindow(SW_HIDE);
//把Dialog移到合適位置
CRect m_rect;
GetClientRect(m_rect);
m_rect.left=200;
m_treePages[0]->MoveWindow(m_rect);
m_treePages[1]->MoveWindow(m_rect);
return true;
}
始初化完成後,我們要添加CTreeCtrl的消息響應事件,這樣才能讓它按我們的要求起作用。我們打開Class Wizard點選IDC_TREE1添加TVN_SELCHANGED消息,並在消息響應函數中寫入代碼。
void CMFC_TreeCRTLDlg::OnSelchangedTree1(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
// TODO: Add your control notification handler code here
UpdateData(true);
node_name=m_mytree.GetItemText(pNMTreeView->itemNew.hItem);
//在標題欄顯示節點信息
SetWindowText(node_name);
//切換面板
if(node_name=="Dialog 1-1"){
m_treePages[0]->ShowWindow(SW_SHOW);
m_treePages[1]->ShowWindow(SW_HIDE);
}
else if(node_name=="Dialog 2-1-1"){
m_treePages[0]->ShowWindow(SW_HIDE);
m_treePages[1]->ShowWindow(SW_SHOW);
}
UpdateData(false);
*pResult = 0;
}
ASSERT(pmyTreeCtrl-> GetImageList(TVSIL_NORMAL) == pmyImageList);
段
1.CImageList myImageList;
2.CImageList::Create
3.CTreeCtrl::SetImageList:
CImageList* SetImageList( CImageList * pImageList, int nImageListType );
段
.h:
HTREEITEM m_hRootItem; //
CImageList MyImageList; //
.cpp
// Create an imagelist for the tree control.
MyImageList.Create( 20, 20, ILC_COLOR24, 2, 1 );
// Had created the imagelist(MyImageList) for the tree control in OnInitDialog.
CBitmap bmImage, bmSelectedImage;
bmImage.LoadBitmap( "NORMALIMAGE " );
bmSelectedImage.LoadBitmap( "SELECTIMAGE " );
int iNo = MyImageList.Add( bmImage.FromHandle( (HBITMAP)(bmImage) ), RGB( 0, 0, 0) );
int iNoSelect = MyImageList.Add( bmSelectedImage.FromHandle( (HBITMAP)(bmSelectedImage) ),
RGB( 0, 0, 0) );
bmImage.DeleteObject();
bmSelectedImage.DeleteObject();
TV_ITEM TreeItem;
TV_INSERTSTRUCT Item;
TreeItem.mask = TVIF_TEXT|TVIF_PARAM|TVIF_IMAGE|TVIF_SELECTEDIMAGE;
TreeItem.iImage = iNo;
TreeItem.iSelectedImage = iNoSelect;
二法
當然有方法了,你看下面的代碼就知道了。
m_img.Create( GetSystemMetrics(SM_CXSMICON),
GetSystemMetrics(SM_CYSMICON),
ILC_COLOR24, 50, 50);
m_img.SetBkColor( GetSysColor(COLOR_WINDOW) );
m_img.Add(ExtractIcon( AfxGetApp()-> m_hInstance, "shell32.dll ", 6));
m_img.Add(ExtractIcon( AfxGetApp()-> m_hInstance, "shell32.dll ", 3));
m_img.Add(ExtractIcon( AfxGetApp()-> m_hInstance, "shell32.dll ", 4));
m_img.Add(ExtractIcon( AfxGetApp()-> m_hInstance, "shell32.dll ", 8));
m_img.Add(ExtractIcon( AfxGetApp()-> m_hInstance, "shell32.dll ", 11));
m_img.Add(ExtractIcon( AfxGetApp()-> m_hInstance, "shell32.dll ", 9));
m_img.Add(ExtractIcon( AfxGetApp()-> m_hInstance, "shell32.dll ", 15));
m_dirTree.SetImageList(&m_img,TVSIL_NORMAL);
其中: CImageList m_img;
CTreeCtrl m_dirTree;
這個是我做的一個關於得到系統所有目錄滴例子中一段代碼,呵呵……(使用的圖標全部是系統圖標)
三法
圖標少的話,可以把所有圖標做成一個bmp,然後loadbitmap,用索引操作.
或者:
CBitmap bmp;
bmp.LoadBitmap(IDB_BMP1);
...
這裏把所有圖標加入imagelist
m_treeList.SetImageList(&m_imageList, TVSIL_NORMAL);
四法
建立一個CTreeCtrl控制成員 m_Tree;
使用圖標的方法:
Step1: //load icon
HICON icon[4];
Icon[0]=AfxGetApp()->LoadIcon(IDI_ICON1);
Icon[1]=AfxGetApp()->LoadIcon(IDI_ICON2);
Step2: //創建CImageList
CImageList *ImageList4Tree = new CImageList;
ImageList4Tree.Create(16,16,0,4,4); //16,16爲圖標分辯率,4,4爲該list最多能容納的圖標數
For(int i=0;i<2;i++)
{
ImageList4Tree->Add(Icon[i]); //讀入圖標
}
Step3: //使用創建好的CImageList
m_Tree.SetImageList(ImageList4Tree);
Step4: //在添加項的同時選用圖標
m_Tree.InsertItem(itemName,0,1,parentItem); //第2個參數是item在添加好後的圖標 //第3個參數爲item在被選中後的圖標
五法
在MFC中應用CTreeCtrl控件的技巧
首先,我們要創建一個基本對話框的MFC工程MFC_TreeCRTL。然後在資源視圖中插入兩個Dialog,ID分別爲IDD_DIALOG11和IDD_DIALOG211,都更改Style屬性爲Child,Border屬性爲None,爲它們建立兩個類,分別命名爲Cdialog11和Cdialog211,並在MFC_TreeCRTLDlg.CPP文件中包含dialog11.h和dialog211.h兩個頭文件。再導入幾個資源圖標作爲樹形控件節點的圖標及裝飾面板。最後在主面板上添加一個CTreeCtrl控件,ID爲默認,並在ClassWizard中添加它的一個變量,命名爲m_mytree。
接着,我們進行具體代碼編寫。
我們必須在CMFC_TreeCRTLDlg 類中加入這些變量和函數
CDialog * m_treePages[2];
CString node_name;
BOOL InitMytree();
我們還要在CMFC_TreeCRTLDlg 類的構造函數中爲m_treePages[2]分配空間,m_treePages[0]=new Cdialog11; m_treePages[1]=new Cdialog211;
InitMytree()函數是 m_mytree 的初始化過程
BOOL CMFC_TreeCRTLDlg::InitMytree()
{
//節點的圖標
int i=0;
int i_count=2;
//載入圖標
HICON icon[4];
icon[0]=AfxGetApp()->LoadIcon (IDI_ICON6);
icon[1]=AfxGetApp()->LoadIcon (IDI_ICON7);
//創建圖像列表控件
CImageList *m_imagelist=new CImageList;
m_imagelist->Create(16,16,0,7,7);
m_imagelist->SetBkColor (RGB(255,255,255));
for(int n=0;n<i_count;n++)
{
m_imagelist->Add(icon[n]); //把圖標載入圖像列表控件
}
m_mytree.SetImageList(m_imagelist,TVSIL_NORMAL); //爲m_mytree設置一個圖像列表,使CtreeCtrl的節點顯示不同的圖標
m_mytree.SetBkColor(RGB(0,250,255));//設置m_mytree的背景色
//創建節點
//父節點
HTREEITEM root0=m_mytree.InsertItem("Dialog1",0,1,TVI_ROOT,TVI_LAST);
HTREEITEM root1=m_mytree.InsertItem("Dialog2",0,1,TVI_ROOT,TVI_LAST);
//一層子節點
HTREEITEM sub_son0=m_mytree.InsertItem("Dialog 1-1",0,1,root0,TVI_LAST);
HTREEITEM sub_son1=m_mytree.InsertItem("Dialog 2-1",0,1,root1,TVI_LAST);
//二層孫子節點
HTREEITEM sub_m_son0=m_mytree.InsertItem("Dialog 2-1-1",0,1,sub_son1,TVI_LAST);
//建立節點對應的Dialog
m_treePages[0]->Create(IDD_DIALOG11,this);
m_treePages[1]->Create(IDD_DIALOG211,this);
m_treePages[0]->ShowWindow(SW_SHOW);
m_treePages[1]->ShowWindow(SW_HIDE);
//把Dialog移到合適位置
CRect m_rect;
GetClientRect(m_rect);
m_rect.left=200;
m_treePages[0]->MoveWindow(m_rect);
m_treePages[1]->MoveWindow(m_rect);
return true;
}
始初化完成後,我們要添加CTreeCtrl的消息響應事件,這樣才能讓它按我們的要求起作用。我們打開Class Wizard點選IDC_TREE1添加TVN_SELCHANGED消息,並在消息響應函數中寫入代碼。
void CMFC_TreeCRTLDlg::OnSelchangedTree1(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
// TODO: Add your control notification handler code here
UpdateData(true);
node_name=m_mytree.GetItemText(pNMTreeView->itemNew.hItem);
//在標題欄顯示節點信息
SetWindowText(node_name);
//切換面板
if(node_name=="Dialog 1-1"){
m_treePages[0]->ShowWindow(SW_SHOW);
m_treePages[1]->ShowWindow(SW_HIDE);
}
else if(node_name=="Dialog 2-1-1"){
m_treePages[0]->ShowWindow(SW_HIDE);
m_treePages[1]->ShowWindow(SW_SHOW);
}
UpdateData(false);
*pResult = 0;
}
轉載地址:http://daiyu0.blog.163.com/blog/static/3873434120111115113245836/