ツリー ビュー項目を追加する方法
項目をツリービューコントロールに追加するには、TVM_INSERTITEMメッセージをコントロールに送信します。 メッセージには、TVINSERTSTRUCT構造のアドレス、親項目、新しい項目を挿入した後の項目、およびその項目の属性を定義するTVITEM構造が含まれます。 属性には、項目のラベル、選択された画像と選択されていない画像、および32ビットのアプリケーション定義値が含まれます。
知っておくべきこと
テクノロジ
前提条件
- C/C++
- Windows ユーザー インターフェイス プログラミング
手順
ツリービューへの項目の追加
このセクションの例では、アプリケーション定義の配列で提供されるドキュメント見出し情報に基づいて目次を作成する方法を示します。 各配列要素は、見出し文字列と見出しレベルを示す整数で構成されます。 この例では、3つのヘッダーレベル(1、2、および3)をサポートしています。
この例には2つの機能があります。 第1の関数は、各見出しとそれに付随する見出しレベルを抽出し、それらを第2の関数に渡します。
2 番目の関数は、ツリービュー制御に項目を追加します。 項目のラベルとして見出しテキストを使用し、新しい項目の親項目を決定するために見出しレベルを使用します。 ツリービューコントロールのルートにレベル1見出しを追加し、前のレベル1項目の子項目としてレベル2見出しを追加するなどします。 この関数は、子項目があるかどうかに基づいて、画像を項目に割り当てます。 項目に子項目がある場合は、閉じたフォルダを表す画像が表示されます。 それ以外の場合は、ドキュメントを表す画像を取得します。 項目は、選択された状態と選択されていない状態の両方に同じ画像を使用します。
// Adds items to a tree-view control.
// Returns the handle to the newly added item.
// hwndTV - handle to the tree-view control.
// lpszItem - text of the item to add.
// nLevel - level at which to add the item.
//
// g_nClosed, and g_nDocument - global indexes of the images.
HTREEITEM AddItemToTree(HWND hwndTV, LPTSTR lpszItem, int nLevel)
{
TVITEM tvi;
TVINSERTSTRUCT tvins;
static HTREEITEM hPrev = (HTREEITEM)TVI_FIRST;
static HTREEITEM hPrevRootItem = NULL;
static HTREEITEM hPrevLev2Item = NULL;
HTREEITEM hti;
tvi.mask = TVIF_TEXT | TVIF_IMAGE
| TVIF_SELECTEDIMAGE | TVIF_PARAM;
// Set the text of the item.
tvi.pszText = lpszItem;
tvi.cchTextMax = sizeof(tvi.pszText)/sizeof(tvi.pszText[0]);
// Assume the item is not a parent item, so give it a
// document image.
tvi.iImage = g_nDocument;
tvi.iSelectedImage = g_nDocument;
// Save the heading level in the item's application-defined
// data area.
tvi.lParam = (LPARAM)nLevel;
tvins.item = tvi;
tvins.hInsertAfter = hPrev;
// Set the parent item based on the specified level.
if (nLevel == 1)
tvins.hParent = TVI_ROOT;
else if (nLevel == 2)
tvins.hParent = hPrevRootItem;
else
tvins.hParent = hPrevLev2Item;
// Add the item to the tree-view control.
hPrev = (HTREEITEM)SendMessage(hwndTV, TVM_INSERTITEM,
0, (LPARAM)(LPTVINSERTSTRUCT)&tvins);
if (hPrev == NULL)
return NULL;
// Save the handle to the item.
if (nLevel == 1)
hPrevRootItem = hPrev;
else if (nLevel == 2)
hPrevLev2Item = hPrev;
// The new item is a child item. Give the parent item a
// closed folder bitmap to indicate it now has child items.
if (nLevel > 1)
{
hti = TreeView_GetParent(hwndTV, hPrev);
tvi.mask = TVIF_IMAGE | TVIF_SELECTEDIMAGE;
tvi.hItem = hti;
tvi.iImage = g_nClosed;
tvi.iSelectedImage = g_nClosed;
TreeView_SetItem(hwndTV, &tvi);
}
return hPrev;
}
// Extracts heading text and heading levels from a global
// array and passes them to a function that adds them as
// parent and child items to a tree-view control.
// Returns TRUE if successful, or FALSE otherwise.
// hwndTV - handle to the tree-view control.
BOOL InitTreeViewItems(HWND hwndTV)
{
HTREEITEM hti;
// g_rgDocHeadings is an application-defined global array of
// the following structures:
// typedef struct
// {
// TCHAR tchHeading[MAX_HEADING_LEN];
// int tchLevel;
// } Heading;
for (int i = 0; i < ARRAYSIZE(g_rgDocHeadings); i++)
{
// Add the item to the tree-view control.
hti = AddItemToTree(hwndTV, g_rgDocHeadings[i].tchHeading,
g_rgDocHeadings[i].tchLevel);
if (hti == NULL)
return FALSE;
}
return TRUE;
}
関連トピック