VC CTreeCtrlの選択されたアイテムを起点に検索する | 株式会社リッカWebサイト

株式会社リッカ

BLOG
ブログ詳細

2018-08-31VC CTreeCtrlの選択されたアイテムを起点に検索する

 

はじめに

CTreeCtrlのItemを選択されたところから検索したいなと思いました。
イメージとしてはレジストリエディタの検索みたいな感じです。
次へとやると選択されたところから下を探して、親をたどって下まで行ったらまた戻ってくるみたいな。

とまー、ツリーと言えば再帰で書けば楽勝でしょ…
と安直に思ったんです。
そしたら、すごいはまってしまったんですね。

検索するときに使うCTreeCtrlのメソッド

HTREEITEMをCTreeCtrlに渡して値の取得や親子兄弟を取得します。
基本、下の関数だけあれば検索できると思います。

HTREEITEM GetRootItem()
-> ツリーのルートアイテムを取得する
HTREEITEM GetSelectedItem()
-> 現在選択されているアイテムを取得する
CString GetItemText(HTREEITEM)
-> HTREEITEMのラベルを取得する
DWORD_PTR GetItemData(HTREEITEM)
-> HTREEITEMのデータを取得する

HTREEITEM GetChildItem(HTREEITEM)
-> HTREEITEMの子を取得する
HTREEITEM GetNextSiblingItem(HTREEITEM)
-> HTREEITEMの兄弟を取得する
HTREEITEM GetParentItem(HTREEITEM)
-> HTREEITEMの親を取得する

しかし、この親子兄弟関係、1個ずつしか取れないのです。
けっこう癖がありますね…

処理説明

自分と兄弟から下のノードとリーフに対して処理を行う。
終わったら、親の取得を行っていく。
処理対象は親の兄弟から。
以降、じいちゃん、ひいじいちゃんと確認していく。

呼び側

現在選択位置から検索して、S_FALSEだったら再度
ルートから検索するようにする。

終わりに

ルートからだけなら、1個目のwhileだけで事足りそうですね。
これに、先代を遡るとややこしくなってきました。
自分がはまったポイントです…
もう少し簡単に書けそうな気がしたのですが、自分はこれが限界の様です…