2010-07-05 10:50:43| 分類: C++學(xué)習(xí)|舉報|字號 訂閱
1. 新建一名為“Tree”的對話框(Dialog based)應(yīng)用程序項目(MFC AppWizard(EXE)),完成后的效果如下:
2. 將原有的一個標簽(靜態(tài)文本框)和兩個命令按鈕刪除,然后往其中添加一個Tree Control,一個List Box,五個Button,完成后的效果如下圖:
各控件屬性見下表:
序號 | 屬性 | 內(nèi)容 | 備注 |
1 | ID | IDC_TREE_INPUT | Tree Control |
2 | ID | IDC_LIST_OUTPUT | List Box |
3 | ID Caption | IDC_BUTTON_Initialize 初始化&1 | Button |
4 | ID Caption | IDC_BUTTON_DeleteOne 刪除一個&2 | Button |
5 | ID Caption | IDC_BUTTON_Clear 刪除全部&3 | Button |
6 | ID Caption | IDC_BUTTON_ShowAll 瀏覽4 | Button |
7 | ID Caption | DC_BUTTON_Exit 退出&0 | Button |
3. 給其中的樹形控件添加一類型為CTreeCtrl的成員變量m_ctrlTree,給其中的列表框控件添加一類型為CListBox的成員變量m_ctrlList,如下圖:
4. 給其中的“初始化”按鈕添加如下代碼:
void CTreeDlg::OnBUTTONInitialize()
{
// TODO: Add your control notification handler code here
//在樹控件中添加按鈕和連線,添加TVS_HASLINES,TVS_LINESATROOT,TVS_HASBUTTONS風(fēng)格
m_ctrlTree.ModifyStyle(0,TVS_LINESATROOT|TVS_HASBUTTONS|TVS_HASLINES);
m_ctrlTree.DeleteAllItems();
CString strText=_T("");
HTREEITEM hRoot=m_ctrlTree.InsertItem(_T("Root"));//插入樹根
for(int i=0;i<4;i++)
{
strText.Format(_T("Item%d"),i);
HTREEITEM hParent=m_ctrlTree.InsertItem(strText,hRoot);//插入第二級內(nèi)容
for(int j=0;j<5;j++)
{
strText.Format(_T("SubItem%d%d"),i,j);
m_ctrlTree.InsertItem(strText,hParent);//插入第三級內(nèi)容
}
}
}
5. 給其中的“刪除一個”按鈕添加如下代碼:
void CTreeDlg::OnBUTTONDeleteOne()
{
// TODO: Add your control notification handler code here
HTREEITEM hSel = m_ctrlTree.GetSelectedItem();
if(hSel==NULL)//沒有選中節(jié)點
return;
else
if(m_ctrlTree.ItemHasChildren(hSel))//選中節(jié)點有子節(jié)點
{
CString strMessage = _T("當(dāng)前選擇的項包含子項,是否刪除?");
if(MessageBox(strMessage,_T(""),MB_YESNO)== IDYES)
m_ctrlTree.DeleteItem(hSel);//刪除子樹
}
else
m_ctrlTree.DeleteItem(hSel);//刪除單個節(jié)點
}
6. 給其中的“刪除全部”按鈕添加如下代碼:
void CTreeDlg::OnBUTTONClear()
{
// TODO: Add your control notification handler code here
m_ctrlTree.DeleteAllItems();//清空樹節(jié)點
}
7. 給其中的“退出”按鈕添加如下代碼:
void CTreeDlg::OnBUTTONExit()
{
// TODO: Add your control notification handler code here
EndDialog(NULL);
}
8. 找到并打開頭文件TreeDlg.h,找到其中的類定義class CTreeDlg : public CDialog,給此類增加一成員函數(shù)如下:
void Search(HTREEITEM hParent,int nOffset)//用于查找的成員函數(shù)
{
CString strText=_T("");
HTREEITEM hChild=NULL;
hChild=m_ctrlTree.GetChildItem(hParent);
while(hChild!=NULL)
{
strText=m_ctrlTree.GetItemText(hChild);
for(int n=0;n<nOffset;n++)
{
strText.Insert(0,_T(""));
}
m_ctrlList.AddString(strText);
if(m_ctrlTree.ItemHasChildren(hChild))
{
Search(hChild,nOffset+1);
}
hChild=m_ctrlTree.GetNextItem(hChild,TVGN_NEXT);
}
}
9. 給其中的“瀏覽”按鈕添加如下代碼:
void CTreeDlg::OnBUTTONShowAll()
{
// TODO: Add your control notification handler code here
m_ctrlList.ResetContent();//清代列表框
HTREEITEM hRoot=m_ctrlTree.GetRootItem();//獲取根節(jié)點
if(hRoot==NULL)//為空樹
return;
else
{
CString strText=m_ctrlTree.GetItemText(hRoot);//獲取節(jié)點文本
m_ctrlList.AddString(strText);
if(m_ctrlTree.ItemHasChildren(hRoot))
Search(hRoot,1);
}
}
10. 運行效果如下列圖所示:
// TODO: Add extra validation here
CTreeCtrl * pTree=(CTreeCtrl*)GetDlgItem(IDC_TREE);
//pTree->SetImageList(&m_imageList,TVSIL_NORMAL);//為該樹狀控件設(shè)置圖像列表
//TVS_HASBUTTONS == 在父項目中顯示(+)或(-)。
//TVS_HASLINES == 在層次中用線條來連接各個項目名稱。
//TVS_LINESATROOT == 在根目錄下的項目也用線連接。
pTree->ModifyStyle(0,TVS_LINESATROOT|TVS_HASBUTTONS|TVS_HASLINES);
//聲明一個結(jié)構(gòu)體,下面是對其所進行的初始化:
TV_INSERTSTRUCT tvinsert;
//hParent=父項目的句柄。如果該值為TVI_ROOTvalue或NULL,該項目插在樹型視圖的根部。
tvinsert.hParent=NULL;
//hInsertAfter確定插入位置,可以取下面的值:
//TVI_FIRST 插在列表的頭部。
//TVI_LAST 插在列表的尾部。
//TVI_SORT 按字母順序插入。
tvinsert.hInsertAfter=TVI_SORT;
//mask用來指定TV_ITEM的哪些成員變量有效。
//譬如,如果指定了TVIF_TEXT,這意味著pszText成員變量是有效的??梢酝瑫r指定幾個標志位。
tvinsert.item.mask=TVIF_IMAGE|TVIF_SELECTEDIMAGE|TVIF_TEXT;
//hItem是樹型視圖項目的句柄。每一個項目都有它自己的句柄,如果要操作一個項目,就必須選擇它的句柄。
tvinsert.item.hItem=NULL;
tvinsert.item.state=0;
tvinsert.item.stateMask=0;
tvinsert.item.cchTextMax=6;
//iImage和iSelectedImage用來指定圖象列表以及一個索引號。
//這樣就知道當(dāng)項目被選中或沒被選中時用哪個圖象來表示該項目。
//像資源管理器中左邊窗口中的文件夾等小圖表就是有這兩個參數(shù)來決定的。
tvinsert.item.iSelectedImage=1;
tvinsert.item.cChildren=0;
tvinsert.item.lParam=0;//lParam=指向結(jié)構(gòu)體TV_INSERTSTRUCT的指針;
//頂層的節(jié)點
tvinsert.item.pszText="Homer";//設(shè)置文本
tvinsert.item.iImage=2;//設(shè)置相關(guān)的圖像列表中的圖像
HTREEITEM hDad=pTree->InsertItem(&tvinsert);//加入到樹的節(jié)點中
tvinsert.item.pszText="Marge";
HTREEITEM hMom=pTree->InsertItem(&tvinsert);
//第二層的節(jié)點--父節(jié)點為hDaD
tvinsert.hParent=hDad;//聲明其父節(jié)點
tvinsert.item.pszText="Bart";
tvinsert.item.iImage=3;
pTree->InsertItem(&tvinsert);
tvinsert.item.pszText="Lisa";//只對需要改變的量進行改變就可以
pTree->InsertItem(&tvinsert);
//第二層的節(jié)點--父節(jié)點為hMum
tvinsert.hParent=hMom;
tvinsert.item.pszText="Bart";
tvinsert.item.iImage=4;
pTree->InsertItem(&tvinsert);
tvinsert.item.pszText="Lisa";
pTree->InsertItem(&tvinsert);
tvinsert.item.pszText="Dilbert";
HTREEITEM hOther=pTree->InsertItem(&tvinsert);
//第三層節(jié)點--父節(jié)點為hOrher
tvinsert.hParent=hOther;
tvinsert.item.pszText="Dogbert";
tvinsert.item.iImage=7;
pTree->InsertItem(&tvinsert);
tvinsert.item.pszText="Ratbert";
pTree->InsertItem(&tvinsert);