ツリービューについて


■ ツリービューの作成方法
 ここではツリービューの標準的な使い方として、エクスプローラの左側のツリービュー形式の作成方法を記します。


1. ツリービューの作成
以下の何れかの方法によってツリービューを作成します。
  • 新規にSDIかMDIのプロジェクトを作成し、最後のビューの選択でCTreeViewを選択する。
  • 既存のプロジェクトに、クラスの追加によりCTreeViewを選択する。
  • 新規にSDIかMDIのプロジェクトを作成し、Windowエクスプローラ スタイルを選択する。左側にツリービューが作成される。(VC6.0のみ)
  • 他にダイアログ内のツリービューコントロールがありますが、他と条件が違うのでここでは省きます。(基本的考え方は同じです。)

2. ツリービューの準備としてビットマップを作成する。
エクスプローラで言うと、フォルダーの閉じたビットマップ開いたビットマップ、ごみ箱のビットマップ等を必要な分だけ作成します。サイズは16x15ぐらいで揃えます。

3. ツリービューのスタイルを設定する。
作成したツリービュー(ここではCMyTreeViewとします。)のスタイルを変更します。

void CMyTreeView::OnInitialUpdate()
{
:
LONG tvs;
tvs = GetWindowLong( m_hWnd, GWL_STYLE);
tvs |= ( TVS_HASLINES | TVS_HASBUTTONS | TVS_LINESATROOT | TVS_SHOWSELALWAYS);
SetWindowLong( m_hWnd, GWL_STYLE, tvs);
TVS_HASLINES、TVS_HASBUTTONS、TVS_LINESATROOTはツリービューに破線とボタンを追加します。
TVS_SHOWSELALWAYSは、ツリービューがフォーカスを失った後も、選択されたアイテムがわかるようにします。
詳細は、『Platform SDK』 の「Tree View Control Window Styles」に載っています。

4. ツリービューに作成したビットマップを登録する。
まず、作成したビットマップのテーブルを作成します。以下に例を示します。
static int images[] =
{
IDB_BITMAP1,
IDB_BITMAP2,
IDB_BITMAP3,
0
};
最後は、ヌルで閉めます。
次に、このリストとリスト内のビットマップをツリービューに登録します。場所は3.の後で良いでしょう。
CBitmap bitmap;
int i, id;
CTreeCtrl& ctrl = GetTreeCtrl();
// Load Icons an generate a iconlist
int n = sizeof(images) / sizeof( int);
m_cImageList.Create( 16, 15, TRUE, n, 0); // 16,15はビットマップのサイズです。
i = 0;
while( id = images[i])
{
bitmap.LoadBitmap( id);
m_cImageList.Add( &bitmap, RGB( 255, 0, 255)); // 黒になる色.
bitmap.DeleteObject();
i++;
}
ctrl.SetImageList( &m_cImageList, TVSIL_NORMAL);
GetTreCtrl()がポイントです。これによりツリービューでツリーコントロールの機能が使用可能になります。
m_cImageListの宣言は次の通りです。
CImageList m_cImageList;
Add()関数では、アイコンも登録できます。詳しくはヘルプを見て下さい。

5. ツリーアイテムを登録する
エクスプローラで言うマイコンピュータ、ドライブ名、ごみ箱等のアイテムを登録します。
必要な入力データは次のものです。
int imageId;
これは、4.で作成したイメージリストの位置です。IDB_BITMAP1なら0、IDB_BITMAP2なら1です。
HTREEITEM parentItem;
これは、登録するアイテムの親のアイテムです。最上位(ROOT)はNULLになり、その子供なら最上位で作成したアイテムが入ります。
LPCTSTR lpText;
これは、アイテムに表示されるテキストです。エクスプローラで言えば、"マイコンピュータ"、"ごみ箱"等です。
LPARAM lParam;
これは、オプションデータです。登録したアイテムが選択された時、この値を取出すことができます。不要なら設定しなくても良いです。
これらの値を使いアイテムを登録します。CTreeCtrl::InsertItem()関数を使用します。この関数は何種類かオーバーロード関数を持ちますが、今回はTV_INSERTSTRUCT構造体をパラメータにしたものを説明します。(tvstruct.item.xxxに関してはTVITEM構造体のヘルプを見て下さい。)
CTreeCtrl& ctrl = GetTreeCtrl();
TV_INSERTSTRUCT tvstruct;
tvstruct.hParent = parentItem;
tvstruct.hInsertAfter = TVI_FIRST;
tvstruct.item.mask = TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_TEXT | TVIF_PARAM;
tvstruct.item.iImage = imageId;
tvstruct.item.iSelectedImage = tvstruct.item.iImage;
tvstruct.item.pszText = (LPTSTR)lpText;
tvstruct.item.lParam = lParam;
Item = ctrl.InsertItem( &tvstruct);
tvstruct.item.maskはどのTVITEMメンバを使用するかを指示します。
tvstruct.item.iSelectedImageはアイテムが選択された時に表示されるビットマップのIDを指定します。(エクスプローラで言えば開かれたフォルダのビットマップ)ここでは、非選択時と同じビットマップにしてあります。
InsertItem()の返り値が登録したアイテムのハンドルになります。このアイテムの子供のparentItemになります。

6. アイテムの選択処理
ツリービューの表示操作(子アイテムの表示・非表示)は自動的に行われますが、ここではユーザー固有の処理の追加方法を記します。例として、アイテムをマウスの右ダブルクリックした時の処理を用います。
先ず、クラスウィザードでNM_DBLCLKの処理を追加します。
void CLeftView::OnDblclk(NMHDR* pNMHDR, LRESULT* pResult)
{
CTreeCtrl& ctrl = GetTreeCtrl();
HTREEITEM item = ctrl.GetSelectedItem();

DWORD lParam = ctrl.GetItemData( item);
: 固有の処理
*pResult = 0;
}
この例は、5.で使用したlParamの値を基に固有の処理をさせる仕組みです。

ツリービューのサンプルとして、リソースビューアーをご覧下さい。