738 __ __________Часть V. Инструментарий программиста

.float fWidthDiff = (fWidth - (fWidth * fCurrScaling)) / 2;

float fHeight = InRect.bottom — InRect.top;

float fHeightDiff = (fHeight - (fHeight * fCurrScaling)) / 2;

// Изменяем величины х & у сторон прямоугольника .InRect.Inflate(-fWidthDiff, -fHeightDiff);

}

Поскольку метод TimerTickO не делает ничего, кроме перерисовки фона, можно перейти прямо к рассмотрению метода paint (). Процедура начинается с простого вычисления размеров наибольшего квадрата, который может быть вписан в текущее окно.

TRect FaceRect, ClientRect = GetClientRect();

int iDiameter = min(ClientRect.right, ClientRect.bottom);

FaceRect. left = (ClientRect. right — iDiameter) '•/ 2;

FaceRect.top = (ClientRect. bottom - iDiameter) /'.2;

FaceRect.right = FaceRect.left + iDiameter;

FaceRect.bottom = FaceRect.top + iDiameter; »

Если бы в нашу задачу входило бы только нарисовать лицо, которое масштабировано так, чтобы вписываться в окно, первая половина задачи была бы выполнена. Однако, для того чтобы лицо могло увеличиваться и сжиматься, необходимо иметь возможность произвольным образом изменять масштаб объекта FaceRect. Эта задача выполняется вызовом метода ScaleRect ().

Метод ScaleRect о выполняет три различные задачи. Он начинается с проверки величины масштабного коэффициента — не достиг ли он своей границы. Иными словами, находится ли текущий масштаб между 10 и 100 процентами? Наше лицо не должно делаться больше окна или становиться неразличимо маленьким. Если граница достигнута, базовый масштабный коэффициент меняет знак и текущий масштабный коэффициент пересчитывается.

// Если достигнут предел масштабирования (т. е. 100% при движении // вверх или 10% при движении вниз), меняем направление // масштабирования на обратное. Вычисляем значение масштаба if ((fCurrScaling >= 1.00 && fScalingFactor > 0.0) II (fCurrScaling <= .10 && fScalingFactor < 0.0))

fScalingFactor = -fScalingFactor;

fCurrScaling += fScalingFactor;

Следующая задача, выполняемая в методе ScaleRect (), состоит в 'том, чтобы по величине масштабного множителя вычислить как должны изменяться стороны х и у прямоугольника.

// Вычисляем новые размеры для текущего значения масштаба float fWidth = InRect.right - InRect.left;