Свойство Canvas в TCustomControl существует, но оно защищено. Поскольку
свойство canvas инкапсулирует windows HDC (Canvas.Handle), вы можете создавать
объект TCanvas и назначать через свойство Handle контекст устройства элементу
управления, на котором вы хотите рисовать.
Для примера:
procedure AControl.DrawLabel(ACaption: TCaption);
var
ACanvas: TCanvas;
DC: HDC;
begin
ACanvas := TCanvas.Create;
try
WindowHandle := parent.Handle;
DC := GetDeviceContext(WindowHandle);
ACanvas.Handle := DC;
with ACanvas dobeginend;
ACanvas.Handle := 0;
ReleaseDC(WindowHandle, DC);
finally
ACanvas.free;
end;
end;
Перевод на русский язык:
Код-сниппет демонстрирует, как отображать текст на родительском контроле с помощью компонента TControl в Delphi.
Идея заключается в создании временного объекта TCanvas и присвоении ему handle родительского контрола'его устройственного контекста (DC) с помощью функции GetDeviceContext. Затем можно использовать этот канвас для рисования текста или других графических элементов на родительском контроле.
Вот шаг за шагом:
Создайте экземпляр TCanvas под именем ACanvas.
Получите handle родительского контрола'его DC с помощью функции GetDeviceContext.
Присвойте handle DC к ACanvas.Handle. Это связывает канвас с родительским контроле'ым DC.
Используйте оператор with для доступа к методам и свойствам объекта TCanvas в пределах области видимости.
В этом примере не выполняются операции рисования в блоке with. Обычно используются канвас для рисования текста или графических элементов здесь, используя методы, такие как TextOut, Line, Ellipse и т.д.
Освободите handle DC с помощью функции ReleaseDC, чтобы освободить системные ресурсы.
Наконец, освободите временный объект TCanvas с помощью вызова ACanvas.Free.
Предлагаемый пример кода - это процедура под именем DrawLabel, которая принимает строку caption в качестве параметра входного аргумента. Она создает новый канвас, получает handle родительского контрола'его DC, присваивает его канвасу, и затем освобождает ресурсы.
Обратите внимание, что это подход требует ручной управления памятью временного объекта TCanvas с помощью вызовов Create и Free. В современных версиях Delphi вы можете рассмотреть использование блока try-finally или оператора using для обеспечения правильного очистки ресурсов.
Вот альтернативное решение, использующее блок try-finally для лучшего управления ресурсами:
procedure AControl.DrawLabel(ACaption: TCaption);
var
DC: HDC;
begin
try
WindowHandle := parent.Handle;
DC := GetDeviceContext(WindowHandle);
TCanvas.Create.Assign(DC);
with TCanvas.Create do
begin
// Рисуйте текст или графические элементы здесь, используя методы канваса.
end;
finally
ReleaseDC(WindowHandle, DC);
TCanvas.Free;
end;
end;
В этом альтернативном реализации создается новый объект TCanvas и присваивается handle родительского контрола'его DC в блоке try. Используется оператор with для доступа к методам канваса. Наконец, ресурсы освобождаются с помощью вызова ReleaseDC и временный объект TCanvas освобождается в блоке finally.
В статье описывается способ вывода текста на родительском элементе управления в Delphi, используя свойство Canvas и контекст устройства для создания объекта TCanvas.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.