ツリーコントロールの全アイテムを走査

種別
MFC

解説
今日はツリーコントロールを取り上げます。
ツリーコントロールは、結構癖のあるコントロールで、アイテムの追加や変更などはすべてメッセージを送って行います。
まあ、MFCのCTreeCtrlを使用すると、それを意識する必要は無いのですが、TREEITEMという名前が付けられたハンドルを各関数呼び出しの度にアイテムを指定するために付けなければならない何とも昔っぽい仕様になっています。
そのため、ちょっと取っつきにくく、慣れるまでに時間が掛かるかもしれません。

今日は、そんなツリーコントロールを全アイテムを1つづつ走査する方法を説明します。

やっていることは、それほど難しくはありません。
①まずルートアイテムのハンドル(hItem)を取得し、
②そのアイテムに任意の処理を行います。
③次のアイテムを探して、ハンドルを入れ替え、②に戻ります。
④すべての走査が完了すると、hItemが NULL になるので、while を抜けるというわけです。

重要な部分は、次のアイテムの探し方です。
まず、子アイテムを探します。
無ければ、兄弟アイテム(同じレベルの次のアイテム)を探します。
それでも無ければ、親アイテムの兄弟アイテムを探します。
それでもなければ、全件終了です。

以下サンプルコードです。

-修正 06/04/17 コードが完全に間違っていました、、、(^^;)-

// ツリーコントロールの全アイテム走査
HTREEITEM hItem = tree.GetRootItem();
while(hItem)
{
    // ここで hItem に対して何か操作を行う

    // 次のアイテムを検索
    HTREEITEM hNext = tree.GetChildItem(hItem);
    if(!hNext) hNext = tree.GetNextSiblingItem(hItem);
    while(!hNext)
    {
        hNext = tree.GetParentItem(hItem);
        if(hNext)
        {
            hItem = hNext;
            hNext = tree.GetNextSiblingItem(hNext);
        }
        else
        {
            // 親の兄弟が無くなった時点で終了
            break;
        }
    }
    hItem = hNext;
}



// TreeCtrlの全アイテム走査
//----------------------------------------------------------

CTreeCtrl& treeCtrl = GetTreeCtrl();
HTREEITEM hItem = treeCtrl.GetRootItem();
while(hItem)
{
// アイテムに対する処理



// 次のアイテムを検索
HTREEITEM hNext = treeCtrl.GetChildItem(hItem);
if(!hNext) hNext = treeCtrl.GetNextSiblingItem(hItem);
if(!hNext)
{
hNext = treeCtrl.GetParentItem(hItem);
if(hNext) hNext = treeCtrl.GetNextSiblingItem(hNext);
}
hItem = hNext;
}

[PR]
by isoq | 2004-02-09 09:15 | C/C++/Win32
e87.com(千趣会イイハナ) 花を贈るなら日比谷花壇
<< DirectShow チャーシュー作りました! >>