Рисование элемента управления.
Отрисовка элемента управления осуществляется в методе OnDraw. Параметры этого метода содержат указатель на контекст устройства, размеры прямоугольника, определяющего границы элемента и прямоугольник , в пределах которого необходимо выполнить перерисовку.
В общем случае внешний вид элемента может зависеть от некоторых свойств элемента, в нашем случае – от свойств Shape и Select, связанных с переменными m_bSelected и m_nShape:
void CMyCtrlCtrl::OnDraw(
CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid)
{
CPen pen;
CBrush foreBrush, backBrush;
CPoint points[3];
pdc->SaveDC();
pen.CreatePen(PS_SOLID, 1, RGB(0, 0, 0));
backBrush.CreateSolidBrush(TranslateColor(AmbientBackColor()));
foreBrush.CreateSolidBrush(GetSelected() ? RGB(255, 0, 0) : RGB(0, 255, 0));
pdc->FillRect(rcBounds, &backBrush);
pdc->SelectObject(&pen);
pdc->SelectObject(&foreBrush);
switch (m_nShape)
{
case 0:
pdc->Ellipse(rcBounds);
break;
case 1:
pdc->Rectangle(rcBounds);
break;
case 2:
points[0].x = rcBounds.left;
points[0].y = rcBounds.bottom - 1;
points[1].x = (rcBounds.left + rcBounds.right - 1) / 2;
points[1].y = rcBounds.top;
points[2].x = rcBounds.right - 1;
points[2].y = rcBounds.bottom - 1;
pdc->Polygon(points, 3);
break;
}
pdc->RestoreDC(-1);
}
Обратите внимание на использование функции AmbientBackColor. Это одна из функций, которые обеспечивают получение свойств окружения контейнера. В нашем случае фон элемента будет совпадать с фоном контейнера. Функция AmbientBackColor возвращает значение типа OLE_COLOR. Для его преобразования в RGB-значение используется функция TranslateColor, также определенная в классе COLEControl.