vc6.0下簡單使用CTreeCtrl (轉自http://www.cnblogs.com/sunnyjones/)

今天簡單的學了下CTreeCtrl,新建一個基於單文檔的MFC工程,在resource的IDD_DIALOG1裏添加一個tree control,將其styles勾上has buttons,has lines,lines at root,通過classWizard添加一個繼承於CDialog的類CExDialog,添加私有成員變量CImageList m_imageList,然後就在OnInitDialog()函數裏添加樹控件的細節:
BOOL CExDialog::OnInitDialog() 
{
    CDialog::OnInitDialog();
    HICON hlcon[
8];
    
    m_imageList.Create( 
1616088 );

    hlcon[
0= AfxGetApp()->LoadIcon( IDI_ICON1 );
    hlcon[
1= AfxGetApp()->LoadIcon( IDI_ICON2 );
    hlcon[
2= AfxGetApp()->LoadIcon( IDI_ICON3 );
    hlcon[
3= AfxGetApp()->LoadIcon( IDI_ICON4 );
    hlcon[
4= AfxGetApp()->LoadIcon( IDI_ICON5 );
    hlcon[
5= AfxGetApp()->LoadIcon( IDI_ICON6 );
    hlcon[
6= AfxGetApp()->LoadIcon( IDI_ICON7 );
    hlcon[
7= AfxGetApp()->LoadIcon( IDI_ICON8 );

    
for ( int n = 0; n < 8; n ++ )
    
{
        m_imageList.Add( hlcon[n] );
    }


    CTreeCtrl
* pTree = (CTreeCtrl*)GetDlgItem( IDC_TREEVIEW1 );
    pTree
->SetImageList( &m_imageList, TVSIL_NORMAL );
    TV_INSERTSTRUCT tvinsert;
    tvinsert.hParent 
= NULL;
    tvinsert.hInsertAfter 
= TVI_LAST;
    tvinsert.item.mask 
= TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_TEXT;
    tvinsert.item.hItem 
= NULL;
    tvinsert.item.state 
= 0;
    tvinsert.item.stateMask 
= 0;
    tvinsert.item.cchTextMax 
= 6;
    tvinsert.item.iSelectedImage 
= 1;
    tvinsert.item.cChildren 
= 0;
    tvinsert.item.lParam 
= 0;
    tvinsert.item.iImage 
= 0;

//////////////////////////////////////////////////////////////////////////
    tvinsert.item.pszText = "HOMER";
    HTREEITEM hDad 
= pTree->InsertItem( &tvinsert );

//////////////////////////////////////////////////////////////////////////
    tvinsert.item.pszText = "Marge";
    HTREEITEM hMom 
= pTree->InsertItem( &tvinsert );

    tvinsert.hParent 
= hDad;
    tvinsert.item.pszText 
= "Bart";
    tvinsert.item.iImage 
= 3;
    pTree
->InsertItem( &tvinsert );

    tvinsert.hParent 
= hMom;
    tvinsert.item.pszText 
= "Lisa";
    tvinsert.item.iImage 
= 6;
    pTree
->InsertItem( &tvinsert );
    
    tvinsert.item.pszText 
= "Dilbart";
    HTREEITEM hOther 
= pTree->InsertItem( &tvinsert );

    tvinsert.hParent 
= hOther;
    tvinsert.item.pszText 
= "Dogbert";
    tvinsert.item.iImage 
= 7;
    pTree
->InsertItem( &tvinsert );

    tvinsert.item.pszText 
= "Ratbert";
    pTree
->InsertItem( &tvinsert );
        
    
return TRUE;  // return TRUE unless you set the focus to a control
                  
// EXCEPTION: OCX Property Pages should return FALSE
}
這樣就建立了兩個父節點,HOMER和Marge,tvinsert.item.iSelectedImage 設置了當選中這項時顯示什麼圖標,tvinsert.item.iImage設置了當沒有選中時顯示的圖標,tvinsert.item.pszText設置顯示出來的文本。如果沒有對tvinsert.hParent進行更改設置,那麼新添加的節點和上一個節點的父節點爲同一節點。
下面這段代碼實現了選中某一項進行的更改操作:
void CExDialog::OnSelchangedTreeview1(NMHDR* pNMHDR, LRESULT* pResult) 
{
    NM_TREEVIEW
* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
    
    CTreeCtrl
* pTree = (CTreeCtrl*)GetDlgItem(IDC_TREEVIEW1);
    HTREEITEM hSelected 
= pNMTreeView->itemNew.hItem;
    
if ( hSelected != NULL )
    
{
        
char text[31];
        TV_ITEM item;
        item.mask 
= TVIF_HANDLE | TVIF_TEXT;
        item.hItem 
= hSelected;
        item.pszText 
= text;
        item.cchTextMax 
= 30;
        VERIFY( pTree
->GetItem(&item) );
        SetDlgItemText( IDC_TREEVIEW1, text );
    }


    
*pResult = 0;
}
      有了這些代碼還是不夠的,如果想顯示的話,我們要把這個頭文件加入到TreeTestView.cpp裏,添加OnLButtonDown事件,並添加一段代碼:
CExDialog dlg;
    dlg.DoModal();
       ok,這樣編譯運行下,點擊鼠標左鍵,就會出現一個樹狀控件,呵呵,簡單吧。。。
這些只是實現了靜態添加樹節點。以後還要深入的學習! 
發佈了23 篇原創文章 · 獲贊 0 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章