给ctreectrl添加图标 转

来源:互联网 发布:chrome for mac 翻墙 编辑:程序博客网 时间:2024/05/20 03:08


 

 

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;
}
最后,我们在 CMFC_TreeCRTLDlg::OnInitDialog()初始化函数里调用InitMytree()函数。程序运行效果:

六法
原创粉丝点击