簡體   English   中英

將項目添加到CTreectrl C ++

[英]Adding item to CTreectrl C++

我需要將項目從VB轉換為C ++。

VB中有樹控件。 為了將項目添加到樹控件中,已使用“添加”方法(節點集合),該方法包含一個稱為“鍵”的參數,單擊該特定項目即可檢索相同的鍵。

使用TVITEM或TVITEMEX結構的CTreeCtrl InsertItem函數中是否有任何此類規定,我們可以在其中向樹控件的每個項目添加一個鍵,並在單擊它時將其取回?

創建根項目:

TV_INSERTSTRUCT tvInsertStruct;
tvInsertStruct.hParent=NULL;
tvInsertStruct.hInsertAfter=TVI_LAST;
tvInsertStruct.item.pszText=_T("ROOT");
tvInsertStruct.item.mask=TVIF_TEXT;

const HTREEITEM hRootItem= m_tree.InsertItem(&tvInsertStruct);

要插入根目錄上懸掛的子項:

for(int i=0; i<SomeCollection.GetCount(); i++)
{
    const CElement* pElement= SomeCollection.GetAt(i);
    ASSERT(pElement);

    CString Name = pElement->GetName();

    tvInsertStruct.hParent = hRootItem;
    tvInsertStruct.hInsertAfter = TVI_LAST;
    const LPTSTR cutJobNameTemp = Name.GetBuffer(0);
    tvInsertStruct.item.pszText = cutJobNameTemp;
    tvInsertStruct.item.mask = TVIF_TEXT;

    HTREEITEM hItem = m_tree.InsertItem(&tvInsertStruct);       
    ASSERT(hItem);      
    tree.SetItemData(hItem, (DWORD_PTR)pElement);
}

回答您問題的代碼行是SetItemData :您可以直接將樹節點句柄與內存地址相關聯SetItemData

要查看所有打開的節點,只需添加:

ExpandTreeCtrl(m_tree);

注意: 我知道以下不是處理樹上項目選擇的最干凈方法,因此我以更正確的方式替換了它,該方式也可以處理鍵盤

若要獲取應用程序響應樹上單擊的入口點,可以在其父對話框(或控件)的消息圖中添加

 ON_NOTIFY(NM_CLICK, IDC_TREE, OnNMClickTree) 

並實現其處理功能

 void CMyDialog::OnNMClickTree(NMHDR *pNMHDR, LRESULT *pResult) { UINT flags; CPoint point; GetCursorPos(&point); *pResult= 0; CTreeCtrl* pTree= dynamic_cast <CTreeCtrl*> (this->GetDlgItem(pNMHDR->idFrom)); if(pTree) { pTree->ScreenToClient(&point); HTREEITEM hItem = pTree->HitTest(point, &flags); if( (flags & TVHT_ONITEMINDENT) || (flags & TVHT_ONITEMBUTTON) ) //do nothing when clicking on the [+]expand / [-]collapse of the tree return; if(!hItem) return; // If you want to get item text: CString sText= pTree->GetItemText(hItem); //To get your element: CElement* pElement = (CElement*)pTree->GetItemData(hItem); } } 

若要獲取應用程序以響應樹上當前所選項目的更改的入口點,可以在其父對話框(或控件)的消息圖中添加

void CMyDialog::OnTreeCtrlSelChanged(NMHDR* pNMHDR, LRESULT* pResult)
{
    NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*) pNMHDR;
    HTREEITEM hItem = pNMTreeView->itemNew.hItem;

    if(!hItem)
        return;

    // If you want to get item text:
    CString sText= m_tree.GetItemText(hItem);

    //To get your element:
    CElement* pElement = (CElement*)m_tree.GetItemData(hItem);
}

並實現其處理功能

 void CMyDialog::OnTreeCtrlSelChanged(NMHDR* pNMHDR, LRESULT* pResult) { NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*) pNMHDR; HTREEITEM hItem = pNMTreeView->itemNew.hItem; if(!hItem) return; // If you want to get item text: CString sText= m_tree.GetItemText(hItem); //To get your element: CElement* pElement = (CElement*)m_tree.GetItemData(hItem); } 

現在取消引用以訪問與樹節點關聯的CElement數據的行是GetItemData 然后使用您得到的指針執行您打算做的事情。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM