Глава 25. Графический интерфейс устройства_______________________737
// УЛЫБКА
// Вычисляем границы прямоугольника для улыбки. Улыбка // определяется как нижняя половина эллипса, который // вписывается в этот прямоугольник TRect SmileRect = FaceRect;
SmileRect.Inflate(-(iDiameter * .20), -(iDiameter * .25));
SmileRect += TSize(0, iDiameter * .10);
int iMidPoint = SmileRect.top +
(SmileRect.bottom — SmileRect.top) / 2;
dc.Arc(SmileRect, TPoint(SmileRect.left, iMidPoint),
TPoint(SmileRect.right, iMidPoint));
// ГЛАЗА
// Устанавливаем перо и кисть; на самом деле перо нам не нужно, // поэтому используем PS_NULL, кисть использует // простую черную заливку. dc.SelectObject(TPenfO, О, PS_NULL)) ;
dc.SelectObject(TBrush(TColor::Black));
«
// Вычисляем размер глаз: 10% от диаметра лица int iEyeDiameter = iDiameter * .10;
TSize EyeSize(iEyeDiameter, iEyeDiameter);
// Сначала рисуем левый глаз ... TPoint UpperLeft(ClientRect.right / 2,
FaceRect.top +
((FaceRect.bottom — FaceRect.top) * .3));
int iOffset = ((UpperLeft.x - SmileRect.left — iEyeDiameter) / 2) ;
UpperLeft.x = SmileRect.left + iOffset;
UpperLeft.у -= iEyeDiameter / 2 ;
dc.Ellipse(UpperLeft, EyeSize);
// Теперь правый. UpperLeft.x = (ClientRect.right / 2) + iOffset;
dc.Ellipse(UpperLeft, EyeSize);
}
// Масштабируем прямоугольник, ограничивающий лицо с
// помощью переменной fScalingFactor
void SmileyWindow::ScaleRect(TRects InRect)
{
// Если достигнут предел масштабирования (т. е. 100% при движении
// вверх или 10% при движении вниз), меняем направление
// масштабирования на обратное. Вычисляем значение масштаба
if ((fCurrScaling >= 1.00 s& fScalingFactor > 0.0) II
(fCurrScaling <= .10 && fScalingFactor < 0.0)) fScalingFactor = -fScalingFactor;
fCurrScaling +== fScalingFactor;
// Вычисляем новые размеры для текущего значения масштаба float fWidth = InRect.right - InRect.left;
24 Зак. 306