Пример рисования на окне c применением Windows API в Delphi
Рассмотрим задачу рисования отрезка прямой линии на окне Windows.
- Создайте новое обычное оконное приложение в Delphi.
- Поместите на форму кнопку из палитры компонентов. По умолчанию Delphi даст ей имя Button1.
- Дважды щелкните мышкой на кнопке Button1 и создайте, таким образом, процедуру обработки нажатия на кнопку.
Текст процедуры обработки сделайте в следующем виде:
procedure TForm1.Button1Click(Sender: TObject);
var
hdc: THandle;
begin
hdc:= GetDC(Form1.Handle);
LineTo(hdc,100,100);
ReleaseDC(Form1.Handle,hdc);
DeleteDC(hdc);
end;
В трех строках в этой процедуре используются три функции Windows API. Запустите программу на выполнение. После нажатия на кнопку на главном окне приложения будет нарисована диагональная линия, идущая из левого верхнего угла клиентской области окна. Рисование линии происходит с помощью функции LineTo, которая рисует линию из текущего положения рисования в точку с указанными координатами (x,y) на окне. Как ни странно может показаться на первый взгляд, первый параметр hdc в этой функции НЕ является непосредственной ссылкой на окно, в которое осуществляется графический вывод. Этот параметр называется контекстом устройства(Device Context).Смысл его в том, что он является ссылкой на устройство вывода, которое, в данном случае, представляет собой окно. Под термином ссылка здесь подразумевается просто некоторый идентификатор, который операционная система присваивает устройству в ответ на запрос прикладной программы.
Почему наше окно операционная система называет устройством? Потому что рисование графики средствами операционной системы может производиться не только на окно монитора, но, например, на принтер или в область оперативной памяти для создания цифрового образа изображения. При этом для вывода графики прикладная программа пользуется одними и теми же функциями для рисования на устройствах, которые имеют разную физическую природу.
Для получения контекста устройства мы воспользовались функцией GetDC. На входе этой функции требуется указать идентификатор окна, с которым мы собираемся работать в дальнейшем. Мы использовали свойство формы Form1.Handle, которое представляет собой идентификатор окна для оконных компонентов Delphi, к каким относится форма. Этот параметр имеет тип HWND. Функция GetDC возвращает значение типа HDC, который в Delphi обозначается как THandle.
Определение.Под контекстом устройства подразумевается совокупность данных, описывающих параметры устройства, необходимые операционной системе для работы с ним.
Третья функция в нашей процедуре, ReleaseDC, выполняет освобождение оконного идентификатора от контекста устройства. Эта функция специально предназначена для оконных контекстов устройств, и первым из двух параметров у нее идет идентификатор окна. Последняя функция DeleteDC(hdc) удаляет контекст устройства и освобождает ресурсы операционной системы связанные с ним.
Рисовать с помощью функций Windows API можно также и на других оконных элементах Windows, например, на поверхности самой кнопки Button1, которая, с точки зрения операционной системы, является просто одним из окон. Для этого в процедуре надо вместо параметра Form1.Handle использовать Button1.Handle. Сам экран или поверхность рабочего стола Windows также имеет оконный идентификатор. Это означает, что для рисования на полном экране можно воспользоваться нашей процедурой. Для этого нужно подставить вместо параметра Form1.Handle значение 0, которому равен идентификатор окна рабочего стола Windows.
Замечание. Подключение функций Windows API в приложениях Delphi делается с помощью интерфейсного модуля Windows.pas. В предыдущем примере нам не пришлось специально подключать этот модуль, так как предложение uses, которое генерируется автоматически, уже содержит указание на модуль Windows.pas. Можете проверить это самостоятельно, заглянув в текст модуля Unit1.pas из предыдущего примера.