CTreeCtrl的用法
?今天簡單的學了下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( 16, 16, 0, 8, 8 );
??? 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,這樣編譯運行下,點擊鼠標左鍵,就會出現一個樹狀控件,呵呵,簡單吧。。。 這些只是實現了靜態添加樹節點。以后還要深入的學習!
?
?
?
轉載于:https://www.cnblogs.com/toconnection/archive/2012/08/08/CTreeCtrl.html
總結
以上是生活随笔為你收集整理的CTreeCtrl的用法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java基础(网络编程---IP、端口、
- 下一篇: paramiko 使用总结(SSH 操作