704 ___ __ ___ ____________Часть V. Инструментарий программиста

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

Разумеется, если вы хотите использовать конкретные преимущества вашего "железа", контекст устройства, как правило, позволяет делать и это. Но, хотя контекст устройства и позволяет действовать программам так, как будто все видеоплаты одинаковы, это не гарантирует во всех случаях машинной независимости кода. Простым примером может быть программа, предполагающая, что она всегда работает с дисплеем с разрешением 1024х768. Если такой программе придется работать на компьютере с простой платой VGA, контекст устройства будет спокойно отрабатывать команды, которые что-то выводят в несуществующую область вне экрана. Лучшим способом избежать таких ошибок будет выяснить через контекст устройства действительные размеры экрана перед установкой таких параметров в программе. Если контекст устройства определяет, что размер экрана меньше (больше), приложение будет иметь возможность настроиться на вывод соответствующим образом.

Типы контекстов устройств. Дедушкой всех классов контекста устрой- -ства- является TDC. Этот класс представляет взгляд библиотеки GDI на клиентские приложения с точки зрения OWL. Вполне понятно, что это очень большой класс. Лучшим способом понять работу класса TDC будет изучать его постепенно.

Большинство функций Win32 GDI имеют по крайней мере один соответствующий себе метод в классе TDC. Многие операции GDI имеют несколько различных способов их вызова в зависимости от информации, имеющейся в данный момент. Так, в следующем примере все варианты вызова метода Rectangle!) допустимы и эквивалентны.

Замечание

IBce фрагменты кода, приводимые в этой главе, предполагают существование экземпляра контекста устройства по имени dc.

//в стиле обычного Windows API dc.Rectangle(10, 10, 150, 150);

// с использованием двух точек TPoint pi. (10, 10), р2(150, 150);

dc.Rectangle(pi, p2);

// с использованием точки и размера TPoint pnt(10, 10);

TSize sz(140, 140);

dc.Rectangle(pnt, sz);