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