戻る 第18章 コントロールの使用
(リストビュー)
次へ

ソース 実行ファイル
sdk18.cpp sdk18.exe

今回はリストビューです。
エクスプローラーでお馴染みでデータの一覧表示に便利なコントロールです。
機能が豊富な分少し難しいです。
しかし使いこなせるとアプリの使い勝手も格段に上昇すると思います。
ぜひとも身に付けてください。

わかりづらいかもしれないので暇を見つけ次第
簡単な使用サンプルを追加していこうと思います。

今回もコモンコントロールなので
includeにcommctrl.hを追加しライブラリにcomctl32.libを
追加する必要がありますので忘れないでください。
スタイル 効果
LVS_ICON アイコン表示
LVS_REPORT 詳細表示
LVS_SMALLICON 小さいアイコン表示
LVS_LIST 一覧表示
LVS_EX_CHECKBOXES(拡張スタイル) チェックボックスをつけます
LVS_EX_FULLROWSELECT(拡張スタイル) 1行選択を可能にします
LVS_EX_GRIDLINES(拡張スタイル) グリッド線を入れます
LVS_EX_HEADERDRAGDROP(拡張スタイル) ヘッダをドラッグ&ドロップ可能にします
#include <windows.h> #include <commctrl.h>//コモンコントロールの使用の為 #pragma comment( lib,"comctl32.lib " )//コモンコントロールの使用の為 HWND hList;//リストビュー用ハンドル LRESULT CALLBACK WinProc(HWND hwnd, UINT msg,WPARAM wP, LPARAM lP) { char str[T_BUFFER];//メッセージボックスに表示するときのテキスト LV_COLUMN lvcol;//リストビューのカラム設定用 LV_ITEM item;//リストビューのアイテム設定用 LV_HITTESTINFO lvhti;//HITTEST設定用 switch(msg){ case WM_CREATE: hList = CreateWindowEx(0, WC_LISTVIEW, "", WS_CHILD | WS_VISIBLE | LVS_REPORT,//レポート表示モード //WM_SIZEで大きさをすぐ変えるのでサイズは0でもいい //WM_SIZEで指定しないのなら直接サイズを記入してください 0, 0, 0, 0, hwnd, (HMENU)ID_LISTVIEW, (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE), NULL); //ラベル作成 lvcol.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM; lvcol.fmt = LVCFMT_LEFT;//テキスト左寄せ lvcol.cx = 100;//ラベル幅 lvcol.pszText = "名前";//ラベルに表示するテキスト lvcol.iSubItem = 0; ListView_InsertColumn(hList, 0, &lvcol); lvcol.cx = 120; lvcol.pszText = "住所"; lvcol.iSubItem = 1; ListView_InsertColumn(hList, 1, &lvcol); item.mask = LVIF_TEXT;//「テキストを入れます」というフラグ item.pszText = "ぶーにゃん";//入れるテキスト item.iItem = 0;//アイテムNo. item.iSubItem = 0;//サブアイテムNo. ListView_InsertItem(hList, &item);//リストビューの項目追加関数 //サブアイテム1を追加 item.pszText = "大阪府大阪市"; item.iItem = 0; item.iSubItem = 1;//ここの数字を変えて同じようにすればサブアイテムを増やせます。 ListView_SetItem(hList, &item); item.pszText = "ななしのごんべぇ"; item.iItem = 1; item.iSubItem = 0; ListView_InsertItem(hList, &item); item.pszText = "住所不定"; item.iItem = 1; item.iSubItem = 1; ListView_SetItem(hList, &item); item.pszText = "その他いろいろ"; item.iItem = 2; item.iSubItem = 0; ListView_InsertItem(hList, &item); item.pszText = "ご自由に"; item.iItem = 2; item.iSubItem = 1; ListView_SetItem(hList, &item); break; case WM_NOTIFY: //ID識別 switch(((LPNMHDR)lP)->idFrom){ case ID_LISTVIEW: //メッセージ識別 switch (((LPNMLISTVIEW)lP)->hdr.code) { //case LVN_ITEMCHANGED://こっちなら選択した瞬間に! case NM_DBLCLK://こっちは項目をダブルクリックしたときに! GetCursorPos((LPPOINT)&lvhti.pt); ScreenToClient(((LPNMLISTVIEW)lP)->hdr.hwndFrom, &lvhti.pt); ListView_HitTest(((LPNMLISTVIEW)lP)->hdr.hwndFrom, &lvhti); if (lvhti.flags & LVHT_ONITEM){ item.mask = TVIF_HANDLE | TVIF_TEXT; item.iItem = lvhti.iItem;//取得ハンドル item.iSubItem = 0;//取得するサブアイテムの番号 item.pszText=str;//格納するテキストバッファ item.cchTextMax=T_BUFFER;//バッファ容量 //いざ取得! ListView_GetItem(((LPNMLISTVIEW)lP)->hdr.hwndFrom, &item); MessageBox(hwnd,str,"選択",MB_OK); } break; } break; default:break; } break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hwnd, msg, wP, lP); } return 0; } //カラム設定用の構造体 typedef struct _LV_COLUMN { UINT mask;//有効な情報 int fmt;//列の配置パターン(LVCFMT_LEFT,LVCFMT_RIGHT,LVCFMT_CENTER) int cx;//列の幅 LPTSTR pszText;//表示テキスト int cchTextMax;//テキストバッファ int iSubItem;//関連付けるサブ項目のインデックス } LV_COLUMN; //アイテム設定用の構造体 typedef struct _LV_ITEM { UINT mask;//有効な情報 int iItem;//参照する項目 int iSubItem;//参照するサブ項目 UINT state;//項目の状態 UINT stateMask;//項目の有効な状態 LPTSTR pszText;//アイテム名 int cchTextMax; int iImage;//イメージリストのイメージ番号 LPARAM lParam; } LV_ITEM; 操作用のマクロの一覧です。
マクロ 効果
int ListView_InsertItem(
HWND hwnd,//リストビューのハンドル
const LV_ITEM FAR *pitem//LV_ITEM構造体へのポインタです。
);
新しい項目を追加します。
BOOL ListView_SetItem(
HWND hwnd,//リストビューのハンドル
const LV_ITEM FAR *pitem//LV_ITEM構造体へのポインタです。
);
サブ項目を追加します。
BOOL ListView_GetItem(
HWND hwnd,//リストビューのハンドル
const LV_ITEM FAR *pitem//LV_ITEM構造体へのポインタです。
);
項目内容を取得します。
int ListView_InsertColumn(
HWND hwnd,//リストビューのハンドル
int index,//iColは新しいカラムのインデックスを指定します。
const LV_COLUMN FAR *col//カラム情報LV_COLUMN構造体へのポインタです。
);
カラム(列)を挿入します。
BOOL ListView_DeleteItem(
HWND hwnd,//リストビューのハンドル
int iItem //削除する項目の項目番号
);
リストビューから項目を削除するマクロです。
成功したらTRUE, 失敗したらFALSEを返します。
VOID WINAPI ListView_SetItemText(
HWND hwnd,//リストビューのハンドル
int index,//アイテム番号
int iSubItem,//サブアイテム番号
LPCSTR pszText//設定するテキスト
);
アイテム名を変更します。
int ListView_GetNextItem(
HWND hwnd,//リストビューのハンドル
int Start,//検索開始番号
UINT flags//検索パターンを指定(一覧は右図に)
);
検索をします。該当するものが無いときはー1を返します。
スタイル効果
LVNI_ABOVE指定項目の上方にある項目を検索します。
LVNI_ALL指定項目より順に検索します。
LVNI_BELOW指定項目より下方を検索します。
LVNI_TOLEFT左にある項目を検索します。
LVNI_TORIGHT右にある項目を検索します。
LVNI_CUTLVIS_CUT状態に設定されている項目を探します。
LVNI_DROPHILITEDLVIS_DROPHILITED状態にある項目を探します。
LVNI_FOCUSEDLVIS_FOCUSED状態にある項目を探します。
LVNI_SELECTEDLVIS_SELECTED状態にある項目を探します。
拡張スタイル: ListView_SetExtendedListViewStyle(C_hwnd, dwStyle)によりリストビューの表示に 拡張スタイルが使えます。
マクロ 効果
ListView_SetExtendedListViewStyle(
HWND hwnd,//リストビューのハンドル
DWORD style//新しいスタイルを指定します
);
拡張スタイルをセットします
DWORD ListView_GetExtendedListViewStyle(
HWND hwnd,//リストビューのハンドル
);
現在のスタイルを取得します