MFC VC++ アプリケーション Tip集 サイト


7章.CListCtrlクラス リストコントロール

7−10.カスタムドロー(NM_CUSTOMDRAW)を使用する







 MFC Class WizardからはNM_CUSTOMDRAWが選択できないようなので自分で記述します。

〜.h:
	// 生成されたメッセージ マップ関数
	//{{AFX_MSG(CTest0031Dlg)
	|
	//}}AFX_MSG
	afx_msg void OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult);
	DECLARE_MESSAGE_MAP()


〜.cpp:
BEGIN_MESSAGE_MAP(CTest0031Dlg, CDialog)
	//{{AFX_MSG_MAP(CTest0031Dlg)
	//}}AFX_MSG_MAP
	ON_NOTIFY(NM_CUSTOMDRAW, IDC_LIST1, OnCustomDraw)
END_MESSAGE_MAP()

void CTest0031Dlg::OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult)
{//NM_CUSTOMDRAW
	LPNMLVCUSTOMDRAW lcd=(LPNMLVCUSTOMDRAW)pNMHDR;

	switch(lcd->nmcd.dwDrawStage)
	{
	case CDDS_PREPAINT:
		*pResult=CDRF_NOTIFYSUBITEMDRAW;//サブアイテムを処理します。
		break;
	case CDDS_ITEMPREPAINT://アイテム単位で処理します。
/*		lcd->clrText=RGB(0xff,0xff,0xff);
		lcd->clrTextBk=RGB(0xff,0x00,0x00);
		*pResult=CDRF_NEWFONT;*/
		*pResult=CDRF_NOTIFYSUBITEMDRAW;//サブアイテムを処理します。
		break;
	case CDDS_ITEMPREPAINT|CDDS_SUBITEM:
		*pResult=CDRF_DODEFAULT;

		if(lcd->nmcd.dwItemSpec==1)
		{//特定のアイテムの色を指定します。
			lcd->clrText=RGB(0xff,0xff,0xff);
			lcd->clrTextBk=RGB(0x00,0x00,0xff);
			*pResult=CDRF_NEWFONT;
		}
		if(lcd->iSubItem==1)
		{//特定のサブアイテムの色を指定します。
			lcd->clrText=RGB(0xff,0xff,0xff);
			lcd->clrTextBk=RGB(0x00,0xff,0x00);
			*pResult=CDRF_NEWFONT;
		}
		if(lcd->iSubItem>1)
		{//サブアイテムの色を指定すると、以降の色が変わってしまうので、、、
			lcd->clrTextBk=GetSysColor(COLOR_WINDOW);
			lcd->clrText=GetSysColor(COLOR_WINDOWTEXT);
			*pResult=CDRF_NEWFONT;
		}
	default:
		*pResult=CDRF_DODEFAULT;
		break;
	}
}


※「SelectObject(lcd->nmcd.hdc,GetStockObject(ANSI_FIXED_FONT));」などによりフォントも変更できます。
※単に太字にするのならFW_BOLDを使う手もあります。


Top へ戻る