リスト ボックスのオーナー描画(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); } |