Для первой кнопки напишем в событии onclick содержимое листинга:
С помощью этой процедуры мы рисуем прямо на экране, вне области окна своей программы. Во время рисования не обращаем внимания на запущенные приложения. Если они попадаются, то рисование происходит поверх них.
Теперь о содержимом программного кода. Вначале объявлена переменная ScreenDC типа hdc. hdc — это тип контекста рисования самой Windows, и работает он почти так же, как и TCanvas (чуть позже вы увидите связь). С помощью функции GetDC(0) мы получаем контекст окна, указанного в качестве параметра. Но в скобках стоит 0 (ноль), а не указатель на реальное устройство или окно. Это значит, что мы хотим получить глобальный контекст, т. е. самого экрана.
Далее вызывается функция Rectangle, она похожа на ту, что мы использовали раньше, когда работали с холстом TCanvas.Rectangle. Есть только одно отличие— первый параметр — теперь контекст устройства, а затем идут координаты прямоугольника. Это связано с тем, что раньше мы рисовали через объект TCanvas, который привязан к определенному компоненту. А это значит, что объект может самостоятельно подставлять указатель на свой объект. Сейчас мы будем рисовать средствами GDI Windows. Его функция Rectangle универсальна и не связана с определенными элементами управления или окнами. Если честно, то процедура TCanvas.Rectangle всего лишь вызывает Rectangle из Windows API и подставляет нужный контекст устройства и размеры, поэтому в ней на один параметр меньше. Сейчас мы сами делаем это без помощи TCanvas.
После рисования освобождается больше не нужный контекст рисования через функцию ReleaseDC. Такие вещи обязательно надо делать, чтобы не засорять память.
Если вы захотите рисовать не на экране, а внутри определенного окна, то в этой процедуре нужно поправить только первую строку. А именно — в качестве параметра GetDC передавать указатель на окно.
Сейчас можно запустить программу и посмотреть на результат. Теперь перейдем ко второй кнопке. Для нее напишем (для процедуры события onclick) содержимое листинга:
Здесь мы получаем копию экрана и сохраняем ее в компоненте image1.
Первая строка такая же, как и в предыдущей процедуре. Мы точно так же получаем контекст рисования экрана. Потом инициализируется переменная canvas типа TCanvas (знакомый нам контекст рисования). Потом мы связываем их между собой с помощью простого присваивания в canvas.Handle:=screenDC. Теперь TCanvas указывает на экран, и можно рисовать на нем привычными методами. Теперь вы видите связь между холстом canvas и контекстом рисования hdc. Объект холста всегда содержит указатель на контекст рисования hdc в свойстве handle и использует этот контекст при вызове всех своих методов (таких как Rectangle). Для компонентов Delphi это свойство заполняется автоматически, и нам не надо о нем заботиться.
Получается, что TCanvas— это объект, который упрощает в Windows API- функции и превращает работу с графикой в объектную.
Далее мы получаем копию экрана и записываем ее в картинку Timage с помощью функции CopyRect У контекста рисования картинки (imagel .Canvas .CopyRect).
После копирования нужно освободить контекст рисования ScreenDC и созданный холст canvas, чтобы освободить выделенную память.