Глава 20. Наследование и полиморфизм___________________________553
// Этот прямоугольник следует заполнить системным цветом переднего // плана, а затем нашу область нужно будет чуть-чуть уменьшить // (см.ниже), чтобы оставить запас для делений. TBrush faceBrush(TColor::Sys3dFace) ;
dc.SelectObject(faceBrush);
dc.PatBIt(cr.left, cr.top, cr.right, cr.bottom);
cr.Inflate(-2, -2);
// Контур индикатора нарисуем цветом системного фона. TPen shadowPen(TColor::Sys3dShadow);
dc.SelectObject(shadowPen);.
// Чтобы нарисовать полукруг, вписанный в нашу клиентскую
// область, нам нужен прямоугольник вдвое выше нашей области.
TRect virtualRect(cr.left, cr.top, cr.right, cr.bottom + cr.Height ());
TPoint start(cr.right, cr.bottom);
TPoint end(cr.left, cr.bottom);
dc.Chord(virtualRect, start, end);
// Если нужно показать деления (т. е. индикатор разбит на*отрезки),
//то придется вычислять их позиции и рисовать как заполненные
// эллипсы.
if (ticks > 0) ,
{
// Заполняем деления цветом полосы, или стрелки, индикатора. TBrush tickBrush(BarColor);
dc.SelectObject(tickBrush) ;
// Разбиваем нашу дугу в 180 градусов на равные сектора и // рисуем в каждой точке (cos(angle), sin(angle)) сплошной // эллипс вокруг дуги. int halfWidth = cr.Width() / 2;
for (int count = 0; count <= ticks; count++)
{
double angleInDegrees = 180 - (count * (180.0 / ticks));
double angleInRadians = angleInDegrees * (3.141592654 / 180);
double x = cr.left + halfWidth + (cos(angleInRadians) * halfWidth);
double у = cr.bottom — (sin(angleInRadians) * cr.Height());
dc. Ellipse (x -2, у—2, х+2, у + 2) ;
)
} }
Очень краткое отступление от темы наследования. В paintBorder мы сначала получаем ограничивающий прямоугольник. Затем мы заполняем этот прямоугольник цветом Sys3dE'ace, закрашивая таким образом наш элемент управления. Затем мы уменьшаем ограничивающий прямоугольник на два пикселя с каждой из сторон, чтобы на нашем индикаторе поместилось са-