VC++の使い方

VC++の使い方 > リファレンス > GUIリファレンス > リストビュー(レポート)
このページの内容
リストビューとは
スタイル
構造体
使い方 - 操作編
使い方 - 共通 -
ありがたいスポンサー様
All About ソフトウエアエンジニア
ネットで8%割引!自動車保険はアメリカンホーム・ダイレクト
人生の「チャンス」と「ピンチ」にモビット!
保険料が一生上がらない、保険料最大50%割引の一生涯の医療保険!

リストビューとは

リストビューのレポートスタイルは、エクスプローラーで「詳細」にしたときのやつです。アイテムの一覧を表示しつつ、その属性を見ることができます。

スタイル

構造体

使い方 - 操作編

基本的に、SendMessage ですべての操作を行えるのですが、ソースが読みにくくなるのでマクロが定義されています。ここでは、そのマクロを使った方法を紹介します。SendMessage を使ってやりたい人は、MSDN のマクロのヘルプを見て、対応するメッセージを送ってください。

注意点をあげておきます

コラムを追加する

LVCOLUMN lvcol;
lvcol.mask = LVCF_TEXT | LVCF_WIDTH;
lvcol.pszText = "text1";
lvcol.cx = 100;
ListView_InsertColumn(hwndList, 0, &lvcol);

lvcol.pszText = "text2";
lvcol.cx = 60;
ListView_InsertColumn(hwndList, 1, &lvcol);

2番目の引数は追加する位置です。 新しく追加されたコラムのインデックスが戻り値となります。

コラムのサイズを取得する

int iWidth = ListView_GetColumnWidth(hwndList, iCol);

コラムのサイズを設定する

ListView_SetColumnWidth(hwndList, iCol, 100);

サイズとして次の値も設定できます。

LVSCW_AUTOSIZE アイテムのサイズに応じて調整。コラムの継ぎ目でダブルクリックしたときと同じ。
LVSCW_AUTOSIZE_USEHEADER ヘッダの文字列のサイズにあわせる。

コラムを削除する

BOOL b = ListView_DeleteColumn(hwndList, iCol);

戻り値には成功したかどうかが入ります。

コラムの数を取得する

実はリストビューコントロールにはコラムの数を取得する方法がありません。じゃあ、どうするかというと、リストビューの子ウインドウであるヘッダービューのウインドウハンドルを取得すればよいのです。

int iCount = Header_GetItemCount(ListView_GetHeader(hwndList));

コラムの並び順を取得する

LVS_EX_HEADERDRAGDROP が設定されている場合は、ヘッダをドラッグすることで順番を並び替えることができます。なかなか知られていない機能ですが、実装しておくと喜ばれるかもしれません。

int iColCount = Header_GetItemCount(ListView_GetHeader(hwndList));
int piOrderArray = new int[iColCount];
ListView_GetColumnOrderArray(hwndList, iColCount, piOrderArray);

例えば、0 番目, 1番目, 2 番目のコラムがあったときに、2番目を先頭に持ってくると、piOrderArray には {2, 0, 1} が帰ってきます。piOrderArray[0] が 2 ということは、0 番目にはインデックス 2 の列がいるということです。

コラムの並び順を設定する

int piOrderArray[] = {2, 0, 1};
ListView_SetColumnOrderArray(hwndList, 3, piOrderArray);

例えば、0 番目, 1番目, 2 番目のコラムがあったときに、2番目を先頭に持ってくると、piOrderArray には {2, 0, 1} が帰ってきます。piOrderArray[0] が 2 ということは、0 番目にはインデックス 2 の列がいるということです。

アイテムを追加する

LVITEM item;
item.mask = LVIF_TEXT | LVIF_PARAM;
item.iItem = iItem;
item.iSubItem = 0;
item.pszText = "item1";
item.lParam = 0;
ListView_InsertItem(hwndList, &item);

iItem 番目の要素を追加します。iSubItem は 0 でなければなりません。戻り値は追加したアイテムのインデックスを表します。-1 だと失敗したということです。

ListView_InsertItem ではサブアイテムを設定することはできません。

サブアイテムを設定する

ListView_SetItemText(hwndList, iItem, iSubItem, "item1-1");

iItem 番目のアイテムの iSubItem 番目のインデックスの列を設定します。

チェックボックスの状態を取得する

LVS_EX_CHECKBOXES が設定されているとき、チェックボックスが表示される。この状態を取得するには次のようにするとよい。

BOOL b = ListView_GetCheckState(hwndList, iItem);

チェックボックスをチェックする

ListView_SetCheckState は定義されていません。そこで、次のようなものを定義してやってください。何で入っていないのかが不思議なんだけど、MSDN にもそう書いてある。

#ifndef ListView_SetCheckState
   #define ListView_SetCheckState(hwndLV, i, fCheck) \
      ListView_SetItemState(hwndLV, i, \
      INDEXTOSTATEIMAGEMASK((fCheck)+1), LVIS_STATEIMAGEMASK)
#endif

使い方は次のような感じ。

ListView_SetCheckState(hwndList, iItem, 1); // チェックする
ListView_SetCheckState(hwndList, iItem, 0); // チェックしない

使い方 - 共通 -

アイテムを追加する

LVITEM item;
item.mask = LVIF_TEXT | LVIF_PARAM;
item.iItem = iItem;
item.iSubItem = 0;
item.pszText = "item1";
item.lParam = 0;
ListView_InsertItem(hwndList, &item);

iItem 番目の要素を追加します。iSubItem は 0 でなければなりません。戻り値は追加したアイテムのインデックスを表します。-1 だと失敗したということです。

ListView_InsertItem ではサブアイテムを設定することはできません。

アイテムを削除する

ListView_DeleteItem(hwndList, iItem);

戻り値は、成功すると TRUE 、失敗すると FALSE となる。

アイテムを全て削除する

ListView_DeleteAllItems(hwndList);

戻り値は、成功すると TRUE 、失敗すると FALSE となる。

アイテムの数を求める

int iCount = ListView_GetItemCount(hwndList);

アイテムの状態を変更する

ListView_SetItemState(hwndList, iItem, LVIS_SELECTED, 0);

第3引数はマスク、第4引数が実際の値です。アイテムの状態のうち、マスクで指定した物についてのみ設定します。上の例だと、選択状態のフラグのみを落とすことができます。

アイテムの状態を取得する

UINT uiState = ListView_GetItemState(hwndList, iItem, LVIS_SELECTED | LVIS_FOCUSED);
if(uiState & LVIS_SELECTED)
{
	// 選択されている
}
else if(uiState & LVIS_FOCUSED)
{
	// フォーカスがある
}

第3引数では、取得したい状態のマスクを指定します。この場合は、選択されているか、フォーカスがあるかを取得できます。他にどのような値を指定できるかは

#LVIS

を参照ください。

テキストを取得する

ListView_GetItemText を使えばよい。

ListView_GetItemText(hwndList, iItem, iSubItem, pszBuf, dwSize);

テキストの長さが不定であるときに、全て取得したい場合は次のようにするとよい。

DWORD dwSize = 256;
char* pszBuf;
while(1)
{
	pszBuf = new char[dwSize];
	ListView_GetItemText(hwndList, iItem, iSubItem, pszBuf, dwSize);
	pszBuf[dwSize - 1] = '\0'; // 2003.09.16追加
	if(lstrlen(pszBuf) != dwSize - 1)
	{
		break;
	}

	delete[] pszBuf;
	dwSize *= 2;
}

// pszBuf の値を参照
// ...

delete[] pszBuf;

テキストを設定する

ListView_SetItemText(hwndList, iItem, iSubItem, "item text");

レポート スタイルのときは、iSubItem でテキストのインデックスを指定することができます。ラベルを変更するときは、iSubItem は 0 にしてください。

ラベルを編集したい

ListView_EditLabel(hwndList, iItem);

戻り値は エディットボックスのウインドウハンドルです。NULL の場合は、失敗した場合です。

サブアイテムを編集したい

リストビューでは、サブアイテムを編集することはできません。サブアイテムを編集できるように見せかけるには、自前でエディットボックスを用意する必要があります。

特定のアイテムを見えるところまでスクロールしたい

ListView_EnsureVisible(hwndList, iItem, FALSE);

第3引数は、一部でも見えるならOKかどうかです。TRUE なら OK ということで、ちょっとでも見えてる状態でこのマクロを呼び出すと、スクロールは発生しません。

色を変更したい

ListView_SetBkColor(hwndList, );
ListView_SetTextColor(hwndList, );

アイテムごとに色を変更するには、オーナードローを用いると便利です。