ツリービューの作成ツリービューとは、選択可能なアイテムを階層で表示するコントロールのことです。アイテムの横にある印を選択することで、下位に存在するアイテムを表示できるようになります。アイテムの左横にはアイコンを表示することも可能です。ツリービューにアイテムを追加するには、TreeView_InsertItemを呼び出します。lpis);hwndTVは、ツリービューのハンドルを指定します。lpisは、TVINSERTSTRUCT構造体のアドレスを指定します。TVINSERTSTRUCT構造体は、次のように定義されています。*LPTVINSERTSTRUCT;hParentは、親アイテムのハンドルを指定します。hInsertAfterは、追加するアイテムの前のアイテムのハンドルを指定します。itemeは、TVITEMEEX構造体を指定します。TVITEMEEX構造体は、次のように定義されています。*LPTVITEMEX;maskは、初期化するメンバを表す定数を指定します。hItemは、アイテムのハンドルを指定します。stateは、アイテムの状態を表す定数を指定します。stateMaskは、アイテムの状態を表す定数を指定します。pszTextは、アイテムのテキストを指定します。cchTextMaxは、pszTextのサイズを指定します。iImageは、イメージリストにおけるアイコンのインデックスを指定します。iSelectedImageは、イメージリストにおける選択されたアイコンのインデックスを指定します。cChildrenは、このアイテムに関連付けられる子アイテムの数を指定します。lParamは、アイテムに関連付けたいデータを指定します。iIntegralは、アイテムの高さを指定します。ツリービューに追加されたアイテムの情報を取得したい場合は、TreeView_GetItemを呼び出します。pitem);hwndTVは、ツリービューのハンドルを指定します。pitemは、TVITEMEX構造体のアドレスを指定します。今回のプログラムは、ツリービューを作成して表示します。アイテムが選択された場合は、アイテムの名前をウインドウタイトルに表示します。&is);}ツリービューを作成するには、ICC_TREEVIEW_CLASSESを指定してInitCommonControlsExを呼び出します。ウインドウクラスにWC_TREEVIEWを指定し、ウインドウスタイルにTVS_HASBUTTONS、TVS_HASLINES、TVS_LINESATROOTを指定します。TVS_LINESATROOTはルート同士をつなぐ線の表示になります。InsertTreeItemは、TreeView_InsertItemの呼び出しをラッピングしたもので次のように実装されています。&is);}hParentは、これから追加するアイテムの親となるアイテムのハンドルを指定します。item.maskは、初期化するメンバを表す定数を指定します。ここではTVIF_TEXTを指定しているので、pszTextメンバが考慮されるようになります。pszTextは、アイテムのテキストを指定します。hParentの子として新しいアイテムが追加されます。これによりどのようなツリーが形成されるかを確認してみましょう。第2引数にはTVI_ROOTを指定します。これを指定して作成されたアイテムは、一番上位に存在するルートアイテムになります。作成されるアイテムはルートアイテムの子となります。展開ボタンを押さなければ確認することはできません。これらのアイテムはhitemParentの子となります。以上の事から、最上位にAが存在し、その下にBが、そしてBの下にCとDが存在します。これはWM_NOTIFYの処理によるものです。0;ツリービューのアイテムを選択した場合は、通知コードがTVN_SELCHANGEDであるWM_NOTIFYが送られます。LPARAMにはNMTREEVIEW構造体が格納されており、itemNew.hItemから選択されたアイテムのハンドルを参照することができます。TreeView_GetItemの呼び出しは成功することになります。この例ではmaskにTVIF_TEXTを指定しているため、pszTextにアイテムのテキストが返ることになります。アイテムの数が多い場合などは表示に時間が掛かることが懸念されます。親アイテムが展開された段階で子アイテムを追加するようにします。&is);}ツリービューの構造は、Aを親としてその下にBとCが存在するものとします。これは子アイテムを動的に追加するのが目的であるからです。InsertTreeItemではcChildrenに1を指定するようにします。これにより、実際に子アイテムを持っていなくても印が表示されるようになります。cChildrenを初期化する場合は、maskにTVIF_CHILDRENを指定します。アイテムが展開された場合は、通知コードがTVN_ITEMEXPANDINGであるWM_NOTIFYが送られます。一度も展開が行われていないことを意味します。よって、このときに子アイテムを追加することになります。親アイテムのハンドルはhItemから参照できます。