Разработчики, работающие с Delphi и Object Pascal, часто сталкиваются с необходимостью изменить визуальное представление элементов интерфейса. Одной из задач, которая может возникнуть, является изменение цвета фона для определенных областей на форме, содержащих уже написанный текст и графику. В данной статье мы рассмотрим, как можно решить эту задачу, используя возможности среды разработки Delphi и DirectX 10.3.
Проблема
Представим, что у нас есть большое белое полотно (на потомке TPanel) с нанесенным текстом и простыми графическими элементами, такими как линии и прямоугольники. Нам необходимо изменить цвет фона некоторых специфических областей с белого на другой цвет, чтобы достичь эффекта, напоминающего цветные ячейки в электронных таблицах, например, как в Excel.
Решение
Изначально может показаться, что задача решается путем заполнения областей до нанесения текста и графики, используя SetBkMode(TRANSPARENT). Однако, в данном случае, необходимо изменить цвет фона после того, как текст и графические элементы уже нанесены. Первоначально была предложена идея замены пикселей по одному, но этот метод оказался слишком медленным и неудовлетворительным с точки зрения качества изображения.
Подход к решению
Чтобы решить данную задачу, необходимо перерисовать весь холст, заполнив фоновые области до нанесения на них текста и линий. После изменения параметров для фонов, необходимо инициировать перерисовку всего холста. Нельзя рисовать на холсте, находясь вне события перерисовки, например, OnPaint.
Для использования потомка TForm следует использовать событие OnPaint, а для потомка TPanel - переопределить виртуальный метод Paint(). В процессе рисования нужно использовать переменные с желаемыми настройками, и вызывать Invalidate() после обновления этих переменных, чтобы инициировать перерисовку.
Пример кода
unit main;
interface
uses
Windows, Forms, SysUtils, Vcl.StdCtrls, UiTypes, System.Classes, Vcl.Controls, Vcl.ExtCtrls, Graphics, Dialogs;
type
TForm1 = class(TForm)
btn_01, btn_02: TButton;
procedure btn_02Click(Sender: TObject);
procedure btn_01Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormPaint(Sender: TObject);
private
FDrawTransparent: Boolean;
FDrawColor: TColor;
procedure write_text(ACanvas: TCanvas; x, y: Integer; i_fontsize: Smallint; const str_text: String; style: TFontStyles; bo_transparent: Boolean);
procedure prepare_example(bo_transparent: Boolean; color_target: TColor);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
const
BASE_COLOR = clWhite;
ALTERNATIVE_COLOR = clRed;
procedure TForm1.FormCreate(Sender: TObject);
begin
FDrawTransparent := False;
FDrawColor := BASE_COLOR;
end;
procedure TForm1.FormPaint(Sender: TObject);
begin
Canvas.Brush.Color := Self.Color;
Canvas.Rectangle(10, 10, 200, 100);
Canvas.MoveTo(10, 110);
Canvas.LineTo(200, 140);
Canvas.MoveTo(10, 140);
Canvas.LineTo(200, 110);
write_text(Canvas, 30, 30, 14, 'This is a text!', [], FDrawTransparent);
write_text(Canvas, 30, 60, 11, 'This is another text!', [fsBold, fsItalic], FDrawTransparent);
end;
procedure TForm1.write_text(ACanvas: TCanvas; x, y: Integer; i_fontsize: Smallint; const str_text: String; style: TFontStyles; bo_transparent: Boolean);
begin
var lo_old_BK_color := ACanvas.Brush.Color;
var lo_old_BK_mode := GetBKMode(ACanvas.Handle);
if bo_transparent then
SetBKMode(ACanvas.Handle, TRANSPARENT)
else begin
SetBKMode(ACanvas.Handle, OPAQUE);
ACanvas.Brush.Color := FDrawColor;
end;
// ... (далее следует код для нанесения текста)
end;
procedure TForm1.prepare_example(bo_transparent: Boolean; color_target: TColor);
begin
FDrawTransparent := bo_transparent;
FDrawColor := color_target;
if bo_transparent then
Color := ALTERNATIVE_COLOR
else
Color := BASE_COLOR;
Invalidate;
Application.MessageBox('Click me', 'Test');
end;
procedure TForm1.btn_01Click(Sender: TObject);
begin
prepare_example(False, ALTERNATIVE_COLOR);
end;
procedure TForm1.btn_02Click(Sender: TObject);
begin
prepare_example(True, BASE_COLOR);
end;
end.
Заключение
При работе с графическими элементами в Delphi важно помнить, что для изменения цвета фона областей с текстом и графикой после их нанесения необходимо использовать события перерисовки, такие как OnPaint для TForm или переопределение метода Paint() для потомков TPanel. Это позволит корректно обновить внешний вид элементов без потери производительности и качества изображения.
Изменение цвета фона для областей с текстом и графикой в Delphi с использованием DirectX 10.3 требует перерисовки холста и использования событий перерисовки, таких как `OnPaint`.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.