Глава 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