|
自描画下拉组合框(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);
}
|