Исчерпывающее руководство по написанию всплывающих подсказок | страница 24
>}
>CODListBox::~CODListBox() { }
>int CODListBox::GetIdealItemRect(int nIndex, LPRECT lpRect) {
> ASSERT(nIndex >= 0);
> int nResult = GetItemRect(nIndex, lpRect);
> if (nResult != LB_ERR) {
> CClientDC DC(this);
> CFont* pOldFont = DC.SelectObject(&m_Font);
> // Calculate the text length.
> CString strItem;
> GetText(nIndex, strItem);
> CSize TextSize = DC.GetTextExtent(strItem);
> // Взять максимум от обычной ширины и идеальной ширины.
> lpRect->right = max(lpRect->right, lpRect->left + TextSize.cx + (m_nEdgeSpace * 2));
> DC.SelectObject(pOldFont);
> }
> return nResult;
>}
>BEGIN_MESSAGE_MAP(CODListBox, CTitleTipListBox)
> //{{AFX_MSG_MAP(CODListBox)
> // NOTE – the ClassWizard will add and remove mapping macros here.
> //}}AFX_MSG_MAP
>END_MESSAGE_MAP()
>/////////////////////////////////////////////////////////////////////////////
>// CODListBox message handlers
>void CODListBox::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) {
> CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
> ASSERT_VALID(pDC);
> int nSavedDC = pDC->SaveDC();
> CString strItem;
> if (lpDrawItemStruct->itemID != –1) {
> GetText(lpDrawItemStruct->itemID, strItem);
> }
> COLORREF TextColor;
> COLORREF BackColor;
> UINT nItemState = lpDrawItemStruct->itemState;
> if (nItemState & ODS_SELECTED) {
> TextColor = RGB(255, 255, 255); // Белый
> BackColor = RGB(255, 0, 0); // Красный
> } else {
> TextColor = RGB(255, 0, 0); // Красный
> BackColor = RGB(255, 255, 255); // Белый
> }
> CRect ItemRect(lpDrawItemStruct->rcItem);
> // Нарисовать фон
> pDC->FillSolidRect(ItemRect, BackColor);
> // Нарисовать текст
> pDC->SetTextColor(TextColor);
> pDC->SetBkMode(TRANSPARENT);
> pDC->SelectObject(&m_Font);
> ItemRect.left += m_nEdgeSpace;
> pDC->DrawText(strItem, ItemRect, DT_LEFT | DT_SINGLELINE | DT_VCENTER);
> ItemRect.left –= m_nEdgeSpace;
> // Нарисовать по необходимости рамку фокуса
> if (nItemState & ODS_FOCUS) {
> pDC->DrawFocusRect(ItemRect);
> }
> pDC->RestoreDC(nSavedDC);
>}
>void CODListBox::MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct) {
> lpMeasureItemStruct->itemHeight = m_nFontHeight + (m_nEdgeSpace * 2);
>}
CODListBox::GetIdealItemRect перекрывает такой же метод в классе CTitleTipListBox. Как вы видите, его реализация похожа на реализацию метода в базовом классе, за исключением того, что новый метод использует для шрифта переменную m_Font. Конечно, я мог бы добиться результата и без переопределения метода базового класса, если бы воспользовался CWnd::SetFont для установки шрифта для списка. Однако я хотел показать, как нужно перекрывать этот метод в других случаях. Например, вам придется переопределить CTitleTipListBox::GetIdealItemRect, если вы захотите показывать в списке картинки.