Работа с экраном в Delphi

Для первой кнопки напишем в событии onclick содержимое листин­га: 

С помощью этой процедуры мы рисуем прямо на экране, вне области окна своей программы. Во время рисования не обращаем внимания на запущенные приложе­ния. Если они попадаются, то рисование происходит поверх них.

 

Теперь о содержимом программного кода. Вначале объявлена переменная ScreenDC типа hdc. hdc — это тип контекста рисования самой Windows, и работает он почти так же, как и TCanvas (чуть позже вы увидите связь). С помощью функ­ции GetDC(0) мы получаем контекст окна, указанного в качестве параметра. Но в скобках стоит 0 (ноль), а не указатель на реальное устройство или окно. Это зна­чит, что мы хотим получить глобальный контекст, т. е. самого экрана.

 

Далее вызывается функция Rectangle, она похожа на ту, что мы использовали раньше, когда работали с холстом TCanvas.Rectangle. Есть только одно отли­чие— первый параметр — теперь контекст устройства, а затем идут координаты прямоугольника. Это связано с тем, что раньше мы рисовали через объект TCanvas, который привязан к определенному компоненту. А это значит, что объект может самостоятельно подставлять указатель на свой объект. Сейчас мы будем рисовать средствами GDI Windows. Его функция Rectangle универсальна и не связана с оп­ределенными элементами управления или окнами. Если честно, то процедура TCanvas.Rectangle всего лишь вызывает Rectangle из Windows API и подставляет нужный контекст устройства и размеры, поэтому в ней на один параметр меньше. Сейчас мы сами делаем это без помощи TCanvas.

 

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

Если вы захотите рисовать не на экране, а внутри определенного окна, то в этой процедуре нужно поправить только первую строку. А именно — в качестве пара­метра GetDC передавать указатель на окно.

ПРИМЕЧАНИЕ. Указатель окна находится в свойстве Handle объекта TForm.

Сейчас можно запустить программу и посмотреть на результат. Теперь перей­дем ко второй кнопке. Для нее напишем (для процедуры события onclick) содер­жимое листинга:

 

Здесь мы получаем копию экрана и сохраняем ее в компоненте image1.

 

Первая строка такая же, как и в предыдущей процедуре. Мы точно так же полу­чаем контекст рисования экрана. Потом инициализируется переменная canvas ти­па TCanvas (знакомый нам контекст рисования). Потом мы связываем их между собой с помощью простого присваивания в canvas.Handle:=screenDC. Теперь TCanvas указывает на экран, и можно рисовать на нем привычными методами. Те­перь вы видите связь между холстом canvas и контекстом рисования hdc. Объект холста всегда содержит указатель на контекст рисования hdc в свойстве handle и использует этот контекст при вызове всех своих методов (таких как Rectangle). Для компонентов Delphi это свойство заполняется автоматически, и нам не надо о нем заботиться.

 

Получается, что TCanvas— это объект, который упрощает в Windows API- функции и превращает работу с графикой в объектную.

Далее мы получаем копию экрана и записываем ее в картинку Timage с помощью функции CopyRect У контекста рисования картинки (imagel .Canvas .CopyRect).

После копирования нужно освободить контекст рисования ScreenDC и создан­ный холст canvas, чтобы освободить выделенную память.

 

dle

Помоги проекту! Расскажи друзьям об этом сайте: