734_____________________ ______Часть V. Инструментарий программиста

Заметим, что когда вызывается метод FloodFiilo, OWL передает Windows сообщение искать область, ограниченную черными линиями. Если вывести десяток линий, для которых атрибуты треп контекста устройства выбраны случайно, цвет пера для всех них останется черным. Это делается для того, чтобы обеспечить Windows возможность определить границы области, когда выдается запрос на ее заполнение. Если бы не были предприняты такие шаги, фактически каждая попытка заливки приводила бы к тому, что краска заливала бы все окно, так что и остальные фигуры становились бы невидимыми.

Хотя заливка выбирается в одном случае из четырех, шансы того, что будет работать ветвь заливки (case: Fills), много меньше 25%. Это происходит потому, что заливка работает только если переменная usTickCount кратна 10. Класс, shapesAndFilisWindow ограничивает число заливок по очень простой причине: они работают слишком медленно. Даже на очень быстрой машине можно увидеть значительные задержки при выполнении заливок больших областей.

«

Окно эллипсов и дуг

Предыдущие два окна выполняли довольно изощренные операции. Маловероятно, что вам понадобится когда-либо на практике писать код, который случайным образом раскрашивает прямоугольники. Рисовать улыбку — совсем другое дело. Нарисуйте лучшую на свете улыбку, и весь мир окажется у вашего порога.

Однако рисование улыбки не такая простая задача, как можно было бы предположить. Можно зашить в программе положение улыбки на экране и не менять его, получив застывшую улыбку. Но это подход программиста под DOS. При программировании под Windows 95 главный девиз — независимость от устройства, а застывшая улыбка противоречит этому, поскольку она смотрится неплохо на мониторе VGA, но будет выглядеть крошечной на мониторе Super VGA с разрешением 1024х768.

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

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

ftifndef SMILEY__H ttdefine SMILEY H