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/