プログラミングメモ →目次

 


リスト ボックスのオーナー描画(VC++)

リスト ボックスのオーナー描画のメモです。簡単な処理をします。処理内容としては、文字のセンタリング表示、絵の表示、選択状態の表示、フォーカスの表示。

1.リソースエディターで、ダイアログにリスト ボックスを貼り付け、プロパティを「オーナー描画、文字列使用」に設定します。

2.CListBoxクラスからCListOwnerDrawクラスを派生します。

3.ClassWizardで、リスト ボックスをCListOwnerDrawクラス型の变量m_listOwner。宣言します。ダイアログのOnInitDialog()関数で、下記のように、適当の初期化をします。

m_listOwner.AddString(_T("筆記"));
m_listOwner.AddString(_T("自描画"));
m_listOwner.AddString(_T("練習"));
m_listOwner.AddString(_T("筆記"));

4.下記のようにvoid CComBoOwnerDraw::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) をオーバーライド、記述します。

void CListOwnerDraw::MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct) 
{
	lpMeasureItemStruct->itemHeight = 20;
}

void CListOwnerDraw::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) 
{
	CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);

	//Selected
	if ((lpDrawItemStruct->itemState & ODS_SELECTED) 
		&& (lpDrawItemStruct->itemAction & (ODA_SELECT | ODA_DRAWENTIRE))) 
	{
		COLORREF hiColor = ::GetSysColor(COLOR_HIGHLIGHT);
		CBrush brHighlight(hiColor); 
		CBrush* pOldBrush = pDC->SelectObject(&brHighlight);
		CPen penHighlight(PS_SOLID, 1, ::GetSysColor(COLOR_HIGHLIGHT));
		CPen* pOldPen = pDC->SelectObject(&penHighlight);
		pDC->Rectangle(&lpDrawItemStruct->rcItem);
		pDC->SetBkColor(::GetSysColor(COLOR_HIGHLIGHT));

		pDC->SetTextColor(::GetSysColor(COLOR_HIGHLIGHTTEXT));

		CString strText;
		GetText(lpDrawItemStruct->itemID, strText);
	    pDC->DrawText(strText, &lpDrawItemStruct->rcItem, DT_SINGLELINE | DT_VCENTER | DT_CENTER); 
		pDC->SelectObject(pOldBrush);
		pDC->SelectObject(pOldPen);
	}

	// De-Selected
	if (!(lpDrawItemStruct->itemState & ODS_SELECTED) 
		&& (lpDrawItemStruct->itemAction & (ODA_SELECT | ODA_DRAWENTIRE))) 
	{
		CBrush brWindow(::GetSysColor(COLOR_WINDOW)); 
		CBrush* pOldBrush = pDC->SelectObject(&brWindow);
		CPen penHighlight(PS_SOLID, 1, ::GetSysColor(COLOR_WINDOW));
		CPen* pOldPen = pDC->SelectObject(&penHighlight);
		pDC->Rectangle(&lpDrawItemStruct->rcItem);
		pDC->SetBkColor(::GetSysColor(COLOR_WINDOW));

		pDC->SetTextColor(::GetSysColor(COLOR_WINDOWTEXT));
		CString strText;
		GetText(lpDrawItemStruct->itemID, strText);
	    pDC->DrawText(strText, &lpDrawItemStruct->rcItem, DT_SINGLELINE | DT_VCENTER | DT_CENTER); 

		pDC->SelectObject(pOldBrush);
		pDC->SelectObject(pOldPen);
	}
	
	CBitmap bmp;
	bmp.LoadBitmap(IDB_BITMAP1);
	pDC->DrawState(CPoint(lpDrawItemStruct->rcItem.left + 2, lpDrawItemStruct->rcItem.top + 2),
					CSize(44, 16),
					&bmp,
					DST_BITMAP);


  // Focus
	if (lpDrawItemStruct->itemAction & ODA_FOCUS) 
		pDC->DrawFocusRect(&lpDrawItemStruct->rcItem);	
}