CTreeCtrl添加图标几种方法

本文介绍在MFC中如何使用CTreeCtrl控件,包括创建图像列表、加载图标、设置图像列表、创建节点等步骤,并提供多种实现方法。同时展示了如何响应选择变化事件来切换关联的对话框。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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);


四法

建立一个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/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值