Глава 25. Графический интерфейс устройства_______________________739
float fWidthDiff = (fwidth - (fWidth * fCurrScaling)) / 2;
float fHeight = InRect.bottom - InRect.top;
float fHeightDiff = (fHeight - (fHeight * fCurrScaling)) / 2;
Наконец, ScaleRect () действительно изменяет прямоугольник в соответствии с текущим масштабом. Результатом является квадрат, который по-прежнему центрирован в клиентском окне, но уже заново масштабирован.
// Изменяем величины х & у сторон прямоугольника InRect.Inflate(-fWidthDiff, -fHeightDiff) ;
К этому моменту прямоугольник FaceRect масштабирован до нужных размеров. Для правильной работы программы далее важно, чтобы все вычисления базировались на размерах FaceRect, а не clientRect.
В функции paint () теперь изменяются диаметр лица, а так же перо и кисть контекста устройства. Заметим, что особое внимание следует обратить на установку размеров пера.
f
int iLineWidth == iDiameter * .05;
if (iLineWidth < 1) iLineWidth = 1;
dc.SelectObject(TPen(TColor::Black, iLineWidth, PS_INSIDE FRAME)) ;
Если толщина пера будет закреплена в программе, рано или поздно возникнет ситуация, когда большое лицо будет иметь очень тонкие губы и границу или, наоборот, получим очень маленькое лицо с толстыми губами и границей. Определяя зависимость толщины линии от размеров лица (в нашем случае полпроцента диаметра), можно гарантировать, что наше лицо будет выглядеть всегда правильно независимо от размеров прямоугольника FaceRect.
Теперь рисование улыбки и глаз — дело математики и зависит от правильного вычисления соотношений. Этот последний шаг требует определенного времени для эксперимента, сразу не ясно, например, что наилучшая картинка получается, если глаза имеют размер в 10 процентов диаметра лица, а высота лба равна 30% диаметра. Некоторые вопросы решаются только методом проб и ошибок.
Совет
В зависимости от скорости вашего компьютера (и даже если он достаточно быстрый), в окне улыбки, возможно, будет заметно мерцание. Частично эту проблему можно снять, использовав код программы GDIDemo (которая входит в поставку Borland C++ 5) в его части, относящейся к Line/MoveTo. Вместо рисования непосредственно в окне программа рисует фигуру в контексте устройства, создающегося на ходу в памяти. Затем вызывается метод контекста устройства окна BitBit (). Этот метод позволяет Windows 95 отображать на экране битовые образы очень быстро и эффективно. Таким образом можно существенно снизить мерцание экрана.
24*