0

ツリー コントロールの特定のノードをクリックすると、リスト コントロールにデータをフェッチするツリー コントロールを持つダイアログを作成しました。これは、ノードを挿入しようとした方法です。

CString *sCommonAppkey = new CString(_szApp + sIsPath);

HTREEITEM hrCommon = m_cTreeCtrl.InsertItem(TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM, _T("Common"), icoPlanit, icoPlanit, 0, 0, (LPARAM)(LPCTSTR)sCommonAppkey, NULL, NULL);

ノードをクリックすると、イベント ハンドラ「OnTvnSelchangedExample」に送られ、HTREEITEM の insertitem メソッドの「lparam」パラメータで指定されたパスからデータがフェッチされます。

void **CExample**::OnTvnSelchangedExample(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);

LPARAM lp = pNMTreeView->itemNew.lParam;

    CString *sTempKey = (CString *)lp;
    CString path = sTempKey->GetBuffer();
}

イベント ハンドラーでのみ lparam 値にアクセスできます。

ここで、ツリーのデータ全体の検索機能を実装したいと考えています。

そのため、ツリー内の特定のテキストを検索できるように、すべてのツリー ハンドルの lparam 値を順番に反復して取得する必要があります。したがって、ツリーのノードをクリックせずに、ツリーハンドル (HTREEITEM) の lparam 値を取得する可能性はありますか?

4

2 に答える 2

0

TreeView_GetChild を使用してルートからツリーを反復処理できます。ハンドルはツリー ハンドルです。ハンドルを取得するには、TreeView_GetItem を呼び出します。

TVITEMEX item;
item.mask = TVIF_PARAM;
item.hItem = hrCommon;

TreeView_GetItem(handle_, &item);
CString* text = (CString*)item.lParam;
于 2016-11-03T15:37:01.197 に答える
0

ツリー トラバーサルは、再帰を使用して簡単に実装できます。

void CMyTreeCtrl::Iterate(HTREEITEM hItem)
{
    if (hItem)
    {
        // Use the tree node corresponding to hItem
        // .....
        // End of using hItem
        hItem = GetNextItem(hItem, TVGN_CHILD);
        while (hItem)
        {
            Iterate(hItem);
            hItem = GetNextItem(hItem, TVGN_NEXT);
        }
    }
    else
    {
        HTREEITEM hItem = GetNextItem(NULL, TVGN_ROOT);
        while (hItem)
        {
            Iterate(hItem);
            hItem = GetNextItem(hItem, TVGN_NEXT);
        }
    }
}

アイテム データを取得する場合は、単に を呼び出す必要がありますGetItemData(hItem)。返しますDWORD_PTR。したがって、あなたの場合は にキャストする必要がありますCString*。それでおしまい。

重要: この例CMyTreeCtrlでは、CTreeCtrl.

于 2016-11-03T16:30:06.130 に答える