リストビューコントロールの使い方

0.リストビューのハンドル取得

HWND hWndListView;
hWndListView = ::GetDlgItem(hWnd, IDC_LISTVIEW);
 
hWnd: リストビューの親ウィンドウのハンドル
IDC_LISTVIEW: コントロールの識別子


1.カラム(項目)の設定

LVCOLUMN insCol = {0};		// 構造体
 
insCol.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM;
	// どの項目を設定するのかを指定する
	//	LVCF_FMT: フォーマットの指定。fmt変数で指定
	//	LVCF_TEXT: テキストの指定。pszTextで指定。cchTextMaxでサイズを指定(必須)
	//	LVCF_WIDTH: カラムの幅(pix)を指定。cxで指定。
	// LVCF_SUBITEM: サブITEMのIDを指定。iSubItemで指定。
 
(例)
TCHAR szText[256];
insCol.cchTextMax = 256;
::_tcscpy_s(szText, 256, _T("Item"));
insCol.pszText = szText;
insCol.cx = 60;
insCol.iSubItem = 0;
 
ListView_InsertColumn(hWndListView, 1, &insCol);		// 追加
// このマクロの中で、LVM_INSERTCOLUMNが送信されている
 

2.アイテム(行)の追加

LVITEM lvItem = {0};		// 構造体
 
lvItem.mask = LVIF_TEXT;
	// 項目設定の指定
	//	LVIF_TEXT: テキストの指定。pszText, cchTextMaxで指定。
	//	LVCF_IMAGE: イメージインデックスの指定。iImageで指定。
	//	(T.B.D.)
lvItem.iItem = _itemAttr.size();	// 追加する位置の指定。0(最上段)~
lvItem.iSubItem = 0;				// 0固定
 
(例)
lvItem.pszText = out;
lvItem.cchTextMax = ::_tcslen(out);
 
ListView_InsertItem(hWndListImgLog, &lvItem);	// 行の追加
// このマクロの中で、LVM_INSERTITEMが送信されている
 

3.セルの値の指定(サブアイテムの指定)

2.では行を追加したが、値を設定できたのは先頭項目だけである。(REPORT形式の場合)
各セルの値を指定するには以下の方法をとる。

基本的には、アイテムの追加と同じ
LVITEM lvItem = {0};		// 構造体
 
lvItem.mask = LVIF_TEXT;
	// 項目設定の指定
	//	LVIF_TEXT: テキストの指定。pszText, cchTextMaxで指定。
	//	LVCF_IMAGE: イメージインデックスの指定。iImageで指定。
	//	(T.B.D.)
lvItem.iItem = _itemAttr.size();	// 設定する行のID
lvItem.iSubItem = 1;				// 設定するサブアイテムID(カラムの設定で指定したもの)
 
(例)
lvItem.pszText = out;
lvItem.cchTextMax = ::_tcslen(out);
 
ListView_SetItem(hWndListImgLog, &lvItem);	// 行の追加
// このマクロの中で、LVM_SETITEMが送信されている
 

4.色の指定

行の色を変更するには、リストビューの描画時に通知されるWM_NOTIFYを処理する。

WM_NOTIFY
wParam: コントロールのID。ただし、識別用にはNMHDR#hWndFormまたはidFormを使用する。
lParam: NMHDR構造体のアドレス

NMHDR* pnmhdr = (NMHDR *)lParam;
 
if(pnmhdr->code == NM_CUSTOMDRAW)		// カスタムドロー通知
 {
	LPNMLVCUSTOMDRAW lpCustomDraw;
	lpCustomDraw = (LPNMLVCUSTOMDRAW) pnmhdr;	// カスタムドロー通知用に切り替える
 
	switch(lpCustomDraw->nmcd.dwDrawStage)
	{
	case CDDS_PREPAINT:		// 行の更新前
		// ↓ ダイアログプロシージャの場合
		::SetWindowLong(hWnd, DWL_MSGRESULT, CDRF_NOTIFYITEMDRAW);	// ITEM更新通知を行う
		// ↓ ウィンドウプロシージャの場合
		// ウィンドウプロシージャの戻り値に、CDRF_NOTIFYITEMDRAWをセットする。
		break;
	case CDDS_ITEMPREPAINT:	// 項目ごとの描画前
		lpCustomDraw->clrText = it_attr->_cl_text;	// 文字色の変更
		lpCustomDraw->clrTextBk = it_attr->_cl_bkg;	// 背景色の変更
		// 変更した場合は、通知を行う
		// ↓ダイアログプロシージャの場合
		::SetWindowLong(hWnd, DWL_MSGRESULT, CDRF_NEWFONT);		// 変更ありの通知
		// ウィンドウプロシージャの場合は、CDRF_NEWFONTを戻り値にセットする
 
		break;
	}	// switch()
 }	// if
 

参考URL:
http://keicode.com/windows/ui02.php(カスタムドロー通知の概念、通知される構造体の関係)
http://lhsp.s206.xrea.com/misc/customdraw.html(いろいろなコントロールのカスタムドローについて)

タグ:

Win32
最終更新:2010年04月01日 21:43