このページの内容 |
---|
リストビューとは |
スタイル |
構造体 |
使い方 - 操作編 |
使い方 - 共通 - |
ありがたいスポンサー様 |
---|
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, );
アイテムごとに色を変更するには、オーナードローを用いると便利です。