|
ツリーコントロールの基本
ツリーコントロールは、エクスプローラなどで使われている、階層構造で表示されるリストです。今回はツリーコントロールの基本的な使い方を見ていきます。

ツリーコントロールのアイテムは、階層構造になっています。あるアイテムの上の階層のアイテムは「親」、下の階層のアイテムは「子」、同じ階層のアイテムは「兄弟」、一番上の階層のアイテムは「ルート」と呼びます。
ではまず、リソースエディタでツリーコントロールを追加しましょう。今回はツリーコントロールとエディットボックス、ボタン2つを追加しました。"追加"ボタンが押されたら、選択されているアイテムの下(子の位置)にアイテムを追加します。"削除"ボタンが押されたら、選択されているアイテムとその子アイテムをすべて削除します。
次にツリーコントロールのプロパティを設定します。ここではリソースIDを指定し、「Has Buttons」「Has
Lines」をそれぞれ「True」にします。「Has Buttons」をTrueにすると、アイテムの左側に+-のアイコンが表示されるようになります。「Has
Lines」をTrueにすると、アイテムの間に線が表示されるようになります。他はデフォルトのままでOKです。

ツリーコントロールの操作は、CTreeCtrlクラスの関数を使って行うので、Control型のDDX変数を追加すると操作が楽になります。ツリーコントロールを右クリックし、「変数の追加」を選択します。

アクセスはprivate、「コントロール変数」をチェックし、カテゴリにControlを選択します。変数のデータ型はCTreeCtrlにします。
変数名はメンバ変数となるのでm_で始まる名前にしましょう。さらにDDXのControl変数であることがわかるようにm_xcで始まる名前にすると分かりやすくなります。この辺は好みで決めましょう。
エディットボックスにはいつも通りDDX変数、ボタンにはBN_CLICKEDのイベントハンドラを追加しました。(これらの使い方については、ボタンの基本、エディットボックスの基本等を見てください。)
ここまででリソースの編集は終了です。では、実装の方を見てみましょう。まずは"追加"ボタンが押されたときのイベントハンドラです。
// "追加"ボタン押下
void CTreeCtrlDlg::OnBnClickedBtnAdd()
{
HTREEITEM hItem = NULL;
int err = 0;
UpdateData();
if (m_xvEditItem.IsEmpty()) err = 1;
if (!err)
{
hItem = m_xcTree.GetNextItem(TVI_ROOT, TVGN_CARET);
if (!m_xcTree.InsertItem(m_xvEditItem, hItem ? hItem : TVI_ROOT)) err = 1;
}
return;
}
|
現在選択されているアイテムを取得するには、CTreeCtrl::GetNextItem()関数を使います。ツリーコントロールでは、アイテムを識別するのに、HTREEITEM型のハンドルを使います。このハンドルが特定のアイテムを表します。TVI_ROOTはルートを表す特殊なハンドルです。GetNextItem()関数はいろいろな条件でアイテムを取得できますが、TVGN_CARETは、選択されているアイテムを取得することを意味します。
| HTREEITEM CTreeCtrl::GetNextItem(HTREEITEM
hItem, UINT nCode) const; |
| 説明: |
次のツリービューアイテムを取得 |
| 引数: |
hItem:前のアイテムのハンドル
nCode:取得する条件を表すフラグ |
| 戻り値: |
正常終了した場合は次のアイテムのハンドル、それ以外の場合はNULL |
アイテムを追加するには、CTreeCtrl::InsertItem()関数を使います。
| HTREEITEM CTreeCtrl::InsertItem(LPCTSTR
lpszItem, HTREEITEM hParent = TVI_ROOT, HTREEITEM hInsertAfter
= TVI_LAST); |
| 説明: |
ツリービューアイテムを挿入 |
| 引数: |
lpszItem:アイテムのテキスト
hParent:挿入されるアイテムの親のハンドル |
| 戻り値: |
正常終了した場合は新しいアイテムのハンドル、それ以外の場合はNULL |
次は、"削除"ボタンが押されたときのイベントハンドラです。
// "削除"ボタン押下
void CTreeCtrlDlg::OnBnClickedBtnDel()
{
HTREEITEM hItem = NULL;
int err = 0;
hItem = m_xcTree.GetNextItem(TVI_ROOT, TVGN_CARET);
if (hItem) if (!m_xcTree.DeleteItem(hItem)) err = 1;
return;
}
|
アイテムを削除するには、CTreeCtrl::DeleteItem()関数を使います。
| BOOL CTreeCtrl::DeleteItem(HTREEITEM
hItem); |
| 説明: |
ツリービューアイテムを削除 |
| 引数: |
hItem:削除するアイテムのハンドル |
| 戻り値: |
正常終了した場合は0以外、それ以外の場合は0 |
では、ビルドして実行してみましょう。"追加"ボタンを押すと、選択されているアイテムの下にアイテムが追加されます。"削除"ボタンを押すと、選択されているアイテム以下のアイテムが削除されます。

|