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

Изменение цвета шрифта заголовка вкладки в TExtendedNotebook: решение и примеры кода на Delphi.

Delphi , Программа и Интерфейс , Заголовок формы

 

Задача изменения цвета шрифта заголовка вкладки в компоненте TExtendedNotebook может оказаться нетривиальной, поскольку стандартные свойства компонента не предоставляют прямого доступа к стилизации заголовков вкладок. В этой статье мы рассмотрим решение, предложенное в обсуждении на форуме, а также предложим альтернативные подходы.

Проблема:

Компонент TExtendedNotebook, как и базовый TPageControl, отрисовывает вкладки, используя механизмы операционной системы. Поэтому прямое изменение цвета шрифта заголовка вкладки через свойства компонента невозможно.

Решение 1: Перехват WM_PAINT и ручная отрисовка (Windows)

Предложенное решение основано на перехвате сообщения WM_PAINT и ручной отрисовке заголовков вкладок. Этот подход работает только для Windows, поскольку использует специфичные для этой ОС API.

Шаги реализации:

  1. Создание потомка от TPageControl: Необходимо создать собственный класс-потомок от TPageControl (или TExtendedNotebook, если вы используете его напрямую).

  2. Перехват сообщения WM_PAINT: В новом классе переопределите обработчик сообщения WM_PAINT.

  3. Ручная отрисовка заголовков: В обработчике WM_PAINT получите контекст устройства (DC) и, используя API Windows, отрисуйте заголовки вкладок с нужным цветом шрифта.

Пример кода (частичный):

type
  TMyPageControl = class(TPageControl)
  private
    procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
  protected
    procedure Paint; override;
  end;

implementation

procedure TMyPageControl.WMPaint(var Message: TWMPaint);
var
  R: TRect;
  C: TControlCanvas;
  L: Integer;
  api : integer;
begin
  inherited; // Важно! Сначала вызываем inherited, чтобы ОС отрисовала фон
  C := TControlCanvas.Create;
  try
    C.Handle := Message.DC;
    api := ActivePageIndex;
    //Form1.memo1.Lines.Add('ActivePage = ' + IntToStr(api)); // Отладочный вывод

    for L := 0 to PageCount - 1 do
    begin
      R := TabRect(L); // Получаем прямоугольник вкладки
      //  C.Brush.Color := Random($00FFFFFF); // Пример случайного цвета

      // Изменяем цвет в зависимости от активности вкладки
      if L = api then
        C.Brush.Color := clBtnHighlight
      else
        C.Brush.Color := clBtnFace;

      C.FillRect(R); // Заливаем прямоугольник

      // Устанавливаем цвет шрифта (пример: инвертированный цвет фона)
      C.Font.Color :=  C.Brush.Color xor $00FFFFFF;

      C.TextOut(R.Left + 5, R.Top + 5, Pages[L].Caption); // Выводим текст
    end;
  finally
    C.Handle := 0;
    C.Free;
  end;
end;

procedure TMyPageControl.Paint;
begin
  inherited;
  Repaint;
end;

Важные моменты:

  • Вызов inherited: Обязательно вызывайте inherited в начале обработчика WM_PAINT, чтобы позволить операционной системе отрисовать фон и другие элементы управления.
  • Освобождение ресурсов: Не забывайте освобождать созданные объекты, такие как TControlCanvas.
  • Обновление: Для перерисовки заголовков вкладок при изменении активной вкладки необходимо вызвать метод Repaint компонента. Это можно сделать в обработчике события OnChange компонента TPageControl:
procedure TForm1.PageControl1Change(Sender: TObject);
begin
  PageControl1.Repaint;
end;

Альтернативное решение: Использование DrawTab

Вместо перехвата WM_PAINT можно переопределить метод DrawTab. Этот метод вызывается для отрисовки каждой вкладки.

type
  TMyPageControl = class(TPageControl)
  protected
    procedure DrawTab(Index: Integer; ARect: TRect; Selected: Boolean); override;
  end;

implementation

procedure TMyPageControl.DrawTab(Index: Integer; ARect: TRect; Selected: Boolean);
var
  TextFlags: Integer;
begin
  with Canvas do
  begin
    FillRect(ARect); // Заливаем фон вкладки

    // Устанавливаем цвет шрифта
    Font.Color := clRed; // Например, красный

    // Устанавливаем выравнивание текста
    TextFlags := DT_CENTER or DT_VCENTER or DT_SINGLELINE;

    // Рисуем текст
    DrawText(Handle, PChar(Pages[Index].Caption), Length(Pages[Index].Caption), ARect, TextFlags);
  end;
end;

Альтернативные подходы:

  • Использование сторонних компонентов: Существуют сторонние компоненты, которые предоставляют более гибкие возможности для стилизации вкладок. Рассмотрите возможность использования таких компонентов, если вам требуется более сложная настройка.
  • Эмуляция вкладок: Можно отказаться от использования TPageControl и создать собственные элементы управления, имитирующие вкладки. Этот подход требует больше усилий, но предоставляет полный контроль над внешним видом и поведением.

Заключение:

Изменение цвета шрифта заголовка вкладки в TExtendedNotebook требует использования нестандартных подходов, таких как перехват WM_PAINT или переопределение DrawTab. Выбор конкретного решения зависит от ваших требований и платформы, на которой разрабатывается приложение. Не забывайте тестировать код на различных версиях Windows, чтобы убедиться в его корректной работе.

Создано по материалам из источника по ссылке.

Статья описывает способы изменения цвета шрифта заголовка вкладки в компоненте TExtendedNotebook на Delphi, включая перехват WM_PAINT, переопределение DrawTab и альтернативные подходы.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




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


:: Главная :: Заголовок формы ::


реклама


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

Время компиляции файла: 2024-12-22 17:14:06
2025-12-08 09:22:26/0.0094621181488037/0