Глава 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, закрашивая таким образом наш элемент управления. Затем мы уменьшаем ограничивающий прямоугольник на два пикселя с каждой из сторон, чтобы на нашем индикаторе поместилось са-