CTreeCtrl添加圖標幾種方法

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/
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章