Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Как изменить цвет фона для областей с текстом и графикой в Delphi, используя DirectX 10.3

Delphi , Графика и Игры , Цвета и Палитра

Разработчики, работающие с 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




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Цвета и Палитра ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-03-14 09:19:01/0.0034730434417725/0