WTLのリストビューで背景色を1行ごとに変える

test99_01.gif
ATL/WTLアプリケーションウイザードでプロジェクトを作成する際に、プロジェクトウイザードの3枚目のユーザーインターフェース機能の設定画面でビューウインドウの形式として「リストビュー」を選択する。

生成したソースコードの中でMainFrm.hのメッセージマップの末尾にREFLECT_NOTIFICATIONSを追加する。
	BEGIN_MSG_MAP(CMainFrame)
  (...省略...)
		REFLECT_NOTIFICATIONS()
	END_MSG_MAP()

次にビュークラスのメッセージマップに2行追加して下記のようにする。ここではプロジェクト名を「Test99」としたためクラス名が「CTest99View」になっている。
	BEGIN_MSG_MAP(CTest99View)
		REFLECTED_NOTIFY_CODE_HANDLER(NM_CUSTOMDRAW, OnCustomDraw)
		MESSAGE_HANDLER(WM_CREATE, OnCreate)
	END_MSG_MAP()

さらに同じくビュークラスの中に新しいメンバー変数を追加する。
	LRESULT OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
	{
		LRESULT	lRet = DefWindowProc();

		SetViewType(LVS_REPORT);
		SetExtendedListViewStyle(LVS_EX_INFOTIP | LVS_EX_FULLROWSELECT);

		InsertColumn(0, _T("カラム"), LVCFMT_LEFT, 100, -1);
		AddItem(0,0,_T("アイテム1"));
		AddItem(1,0,_T("アイテム2"));
		AddItem(2,0,_T("アイテム3"));
		AddItem(3,0,_T("アイテム4"));
		AddItem(4,0,_T("アイテム5"));

		return	lRet;
	}

	LRESULT OnCustomDraw(int /*idCtrl*/, LPNMHDR pnmh, BOOL& bHandled)
	{
		LPNMLVCUSTOMDRAW	pCustomDraw;

		pCustomDraw = (LPNMLVCUSTOMDRAW)pnmh;

		switch(pCustomDraw->nmcd.dwDrawStage)
		{
		case	CDDS_PREPAINT:
			return	CDRF_NOTIFYITEMDRAW;

		case	CDDS_ITEMPREPAINT:
			if(pCustomDraw->nmcd.dwItemSpec % 2)
			{
				pCustomDraw->clrTextBk = RGB(250, 240, 150);
				pCustomDraw->clrText = RGB(0, 0, 200);
				return CDRF_NEWFONT;
			}
		}

		bHandled = FALSE;
		return	0;
	}


test99_02.gif
これで実行するとアイテムが1行ごとに背景色が変わるリストビューとなる。

プロジェクトファイルをダウンロード


カテゴリー「ウインドウ操作」 のエントリー