MFC の CTreeCtrl クラスにおける階層数の制限について


こんにちは、Platform SDK (Windows SDK) サポートチームです。
今回は、MFC の CTreeCtrl クラスで、ツリー ビューの 256 階層目が表示できない現象について、お知らせします。

 

概要

MFC でツリー ビュー コントロールを扱う場合は、CTreeCtrl クラスを使用します。
ツリー ビュー コントロールは、エクスプローラーなどで使用されている、階層構造で表示されるリストです。
たとえば、以下のように表示されます。

pic1

 

この CTreeCtrl クラスを利用した場合、表示対象の階層構造が、255 階層を超える場合は、表示することができません。
[+] ボタンを押下しても 256 階層目が表示されず、以下のとおり、最下層のように表示されます。

pic2

 

現象

CTreeCtrl クラスでは、CTreeCtrl::GetParentItem メソッドを用いて、親のアイテム データを取得可能です。
257 番目の階層で CTreeCtrl::GetParentItem メソッドを呼び出すと、戻り値としてルート アイテムを示す NULL が返されます。
このため、表示上では、1 階層目 ~ 255 階層目が一つのツリーとして表示され、256 階層目以降は、一つ目のツリーの下側に左端から別ツリーとして表示されます。

 

原因

MFC の CTreeCtrl クラスは、comctl32.dll で定義された OS 標準の TreeView コントロールを使用しています。
この TreeView コントロールにてサポートされているノードの階層は 255 までと定義されています。
これは comctl32.dll の仕様上の制限事項です。
なお、comctl32.dll の TreeView コントロールは、Windows フォーム アプリケーションでも使用されているため、Windows フォーム アプリケーションでも同様の現象が発生します。

 

対処方法

アプリケーションから、本動作を変更する方法はありません。
表示対象の階層が、255 階層を超えないようご注意ください。

 

対象製品

Windows 7 以降の OS