天天看點

CTreeCtrl基本使用

在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;

}