|
自描画列表框(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);
}
|