2016-08-25 20 views
0

私は、プロジェクトをVBからC++に変換する必要があります。CTreectrlにアイテムを追加するC++

VBではツリーコントロールがあります。 TreeコントロールのAddメソッド(ノードコレクション) が使用されました。これには "key"というパラメータがあり、その特定のアイテムをクリックして同じキーを取得できます。

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

ルートに掛かったサブアイテムを挿入するには:あなたのルートアイテムを作成するには

+0

[TVITEM LPARAMに文字列を保存する]の可能な複製(http://stackoverflow.com/questions/13285126/tvitem-lparam-to-store-string) –

+0

ありがとう。どのように私はそれを取得中に行うのですか?私はアイテムがクリックされ、私はデータを取得するためにOnTvnSelchangedTree()イベントを使用しているときにそれが必要です。私はLPARAM lp = pNMTreeView-> itemNew.lParamをやってみました。しかし、それは私が保存したものを返しません。 –

+0

[CTreeCtrl :: GetSelectedItem()](https://msdn.microsoft.com/en-us/library/8bkz91b4.aspx)には、現在選択されている項目が表示されます。しかし、あなたは*「CTreectrlにアイテムを追加する」*を求めていました。 –

答えて

1

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です:それをあなたに直接関連付けることができますメモリアドレスを持つツリーノードハンドル。

すべてのノードが開いていることを確認するには、

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

} 
} 

あなたがその親ダイアログ(またはコントロール)に追加することができ、ツリー上で現在選択されている項目の変化に対応するアプリのエントリポイントを取得するためのメッセージマップ

ON_NOTIFY(TVN_SELCHANGED,IDC_TREE, OnTreeCtrlSelChanged) 

とその処理機能を実装

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です。次に、あなたが持っているポインターで意図したことをします。

+2

ユーザーがキーボードで項目を変更した場合、これは機能しません。 'ON_NOTIFY(TVN_SELCHANGED、IDC_TREE1、OnTreeSelChanged)を使うだけです...' –

+0

@BarmakShemirani:私はちょうどあなたのコメントをupvotedして、私はそれに応じて私の答えを変更します。 – sergiol

+0

CElementは何ですか? –

関連する問題