在OnInitDialog()函數中初始化CTreeCtrl
//初始化CTreeCtrl,為節點添加圖檔
//資源ID,顯示的圖示x軸像素,分組
m_pImage->Create(IDB_BITMAP1,24,2,RGB(255,255,255));
m_TreeCtrl.SetImageList(pImage,TVSIL_NORMAL);
//插入root節點
HTREEITEM hRoot = m_TreeCtrl.InsertItem(saValues1[0],0,0,TVI_ROOT,TVI_LAST);
m_TreeCtrl.SetItemData(hRoot,(DWORD)pmbgeo);
//插入葉節點
HTREEITEM ITEM = m_TreeCtrl.InsertItem(saValues2[0],2,2,hRoot,TVI_SORT);
m_TreeCtrl.SetItemData(ITEM,(DWORD)pgridgeo);
//展開節點
m_TreeCtrl.Expand(hRoot,TVE_EXPAND);
//顯示第一個節點
HTREEITEM hItem = m_TreeCtrl.GetRootItem();
m_TreeCtrl.Select(hItem,TVGN_FIRSTVISIBLE);
//滑鼠單擊消息
OnClickTreeMaplist(NMHDR* pNMHDR, LRESULT* pResult)
{
BOOL bCheck ;
CPoint myPoint;
GetCursorPos(&myPoint) ;
m_TreeCtrl.ScreenToClient(&myPoint) ;
UINT uFlags;
//确定相對于工作區的樹視圖控件的指定點的位置
HTREEITEM hItem = m_TreeCtrl.HitTest(myPoint, &uFlags);
//擷取複選框消息 -- TVHT_ONITEMSTATEICON
if (hItem && (TVHT_ONITEMSTATEICON & uFlags))
{
//子節點狀态随父節點
if (m_TreeCtrl.ItemHasChildren(hItem)) //父節點
{
bCheck = m_TreeCtrl.GetCheck(hItem); //擷取目前複選狀态
SetChildCheck(hItem,!bCheck); //設定子項複選狀态
{
m_TreeCtrl.Expand(hItem,TVE_EXPAND);
hItem = m_TreeCtrl.GetChildItem(hItem); //擷取子項句柄
while (hItem)
{
m_TreeCtrl.SetCheck(hItem, bCheck);
SetChildCheck(hItem,bCheck); //遞歸調用
hItem = m_TreeCtrl.GetNextSiblingItem(hItem); //擷取兄弟的句柄
}
}
}
else
{
HTREEITEM hParent = m_TreeCtrl.GetParentItem(hItem);
CString str = m_TreeCtrl.GetItemText(hParent);
m_TreeCtrl.Select(hParent,TVGN_CARET);
}
}
//擷取滑鼠點選的節點和圖示的消息 — TVHT_ONITEMLABEL|TVHT_ONITEMICON
if (hItem && (TVHT_ONITEMLABEL|TVHT_ONITEMICON & uFlags))
{
…
}
//點選+-折疊展開樹
if (hItem && (TVHT_ONITEMBUTTON & uFlags))
{
//擷取Ctrl鍵是否被按住
short nState = GetKeyState(VK_CONTROL);
if (nState == -127 || nState == -128)
{
UINT nItemExpand = m_TreeCtrl.GetItemState(hItem,TVIS_EXPANDED);
if ((nItemExpand & TVIS_EXPANDED)!= TVIS_EXPANDED) //樹處于收縮狀态
{
HTREEITEM hRoot = m_TreeCtrl.GetRootItem();
while(hRoot)
{
if (hRoot == hItem)
{
//不處理已經點選+-的節點
hRoot = m_TreeCtrl.GetNextItem(hRoot,TVGN_NEXT);
continue;
}
UINT nExpand = m_TreeCtrl.GetItemState(hRoot,TVIS_EXPANDED);
//判斷每個父節點的收縮狀态
if ((nExpand & TVIS_EXPANDED)!=TVIS_EXPANDED)
{
m_TreeCtrl.Expand(hRoot,TVE_EXPAND);
}
hRoot = m_TreeCtrl.GetNextItem(hRoot,TVGN_NEXT);
}
}
else //處于展開狀态
{
HTREEITEM hRoot = m_TreeCtrl.GetRootItem();
while(hRoot)
{
if (hRoot == hItem)
{
hRoot = m_TreeCtrl.GetNextItem(hRoot,TVGN_NEXT);
continue;
}
UINT nExpand = m_TreeCtrl.GetItemState(hRoot,TVIS_EXPANDED);
if ((nExpand & TVIS_EXPANDED)==TVIS_EXPANDED)
{
//收縮節點 TVE_COLLAPSE
m_TreeCtrl.Expand(hRoot,TVE_COLLAPSE);
}
hRoot = m_TreeCtrl.GetNextItem(hRoot,TVGN_NEXT);
}
}
m_TreeCtrl.Select(hItem,TVGN_CARET);
}
}
}
//滑鼠輕按兩下節點消息
OnDblclkTreeMaplist(NMHDR* pNMHDR, LRESULT* pResult)
{
//*pResult傳回TRUE可以屏蔽輕按兩下展開節點操作
*pResult = TRUE;
}