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
です。次に、あなたが持っているポインターで意図したことをします。
[TVITEM LPARAMに文字列を保存する]の可能な複製(http://stackoverflow.com/questions/13285126/tvitem-lparam-to-store-string) –
ありがとう。どのように私はそれを取得中に行うのですか?私はアイテムがクリックされ、私はデータを取得するためにOnTvnSelchangedTree()イベントを使用しているときにそれが必要です。私はLPARAM lp = pNMTreeView-> itemNew.lParamをやってみました。しかし、それは私が保存したものを返しません。 –
[CTreeCtrl :: GetSelectedItem()](https://msdn.microsoft.com/en-us/library/8bkz91b4.aspx)には、現在選択されている項目が表示されます。しかし、あなたは*「CTreectrlにアイテムを追加する」*を求めていました。 –