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


6章.ListBoxクラス リストボックス

6−3.オーナー描画する






 プロパティでオーナー描画を「固定」もしくは「可変」にします。
 「文字列あり」を必要に応じてチェックします。

void CTest0037Dlg::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
{//WM_DRAWITEM
	// TODO:この位置にメッセージ ハンドラ用のコードを追加するかまたはデフォルトの処理を呼び出してください
	if(nIDCtl==IDC_LIST1)
	{
		BYTE r,g,b;
		COLORREF rgb;
		CString csb;
		CListBox *clb=(CListBox *)GetDlgItem(nIDCtl);
		CDC *cdc=CDC::FromHandle(lpDrawItemStruct->hDC);
		CRect crt=lpDrawItemStruct->rcItem;

		r=g=b=0x00;
		if(lpDrawItemStruct->itemID & 1) r=0xff;
		if(lpDrawItemStruct->itemID & 2) g=0xff;
		if(lpDrawItemStruct->itemID & 4) b=0xff;
		if(lpDrawItemStruct->itemState & ODS_SELECTED)
			r=r/3*2,g=g/3*2,b=b/3*2;
/*			rgb=::GetSysColor(COLOR_HIGHLIGHT);
		else rgb=::GetSysColor(COLOR_WINDOW);*/
		rgb=RGB(r,g,b);
		cdc->FillSolidRect(&crt,rgb);
//		if(lpDrawItemStruct->itemState & ODS_FOCUS) cdc->DrawFocusRect(&crt);

		clb->GetText(lpDrawItemStruct->itemID,csb);
		cdc->SetTextColor(RGB(0xff-r,0xff-g,0xff-b));
		cdc->DrawText(csb,&crt,
			DT_LEFT|DT_WORDBREAK|DT_EXPANDTABS|DT_CALCRECT);
		cdc->DrawText(csb,&crt,DT_LEFT|DT_WORDBREAK|DT_EXPANDTABS);
	}

	CDialog::OnDrawItem(nIDCtl, lpDrawItemStruct);
}

※OnMeasureItem(WM_MEASUREITEM)で高さを指定できます。
※「可変」を指定した場合はOnMeasureItemがアイテムごとに呼ばれます。




Top へ戻る