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

 


コンボ ボックスのオーナー描画(VC++)

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

1.リソースエディタで、ダイアログにコンボボックスを貼り、プロパティを「オーナー描画、ドロップリスト,文字列使用」。

2.CComboBoxからCComBoOwnerDraw派生します。

3.ClassWizardで、貼ったばかりのコンボボックスをCComBoOwnerDraw型の変数m_cmboOwnerを宣言します。ダイアログの派生クラスのOnInitDialog()中で、下記のように適当な初期化をします。

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

4.void CComBoOwnerDraw::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) をオーバーライドと実装します。

void CComBoOwnerDraw::MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct) 
{
	lpMeasureItemStruct->itemHeight = 22;
}

void CComBoOwnerDraw::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));

		if (lpDrawItemStruct->itemID != -1)
		{
			CString strText;
			GetLBText(lpDrawItemStruct->itemID, strText);
			strText += _T("(by softist)");
			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));
		if (lpDrawItemStruct->itemID != -1)
		{
			CString strText;
			GetLBText(lpDrawItemStruct->itemID, strText);
			strText += _T("(by softist)");
			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);	

}