| ■ ツリービューの作成方法 |
| ここではツリービューの標準的な使い方として、エクスプローラの左側のツリービュー形式の作成方法を記します。 1. ツリービューの作成 以下の何れかの方法によってツリービューを作成します。
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の値を基に固有の処理をさせる仕組みです。
|