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;