Задача изменения цвета шрифта заголовка вкладки в компоненте TExtendedNotebook может оказаться нетривиальной, поскольку стандартные свойства компонента не предоставляют прямого доступа к стилизации заголовков вкладок. В этой статье мы рассмотрим решение, предложенное в обсуждении на форуме, а также предложим альтернативные подходы.
Проблема:
Компонент TExtendedNotebook, как и базовый TPageControl, отрисовывает вкладки, используя механизмы операционной системы. Поэтому прямое изменение цвета шрифта заголовка вкладки через свойства компонента невозможно.
Решение 1: Перехват WM_PAINT и ручная отрисовка (Windows)
Предложенное решение основано на перехвате сообщения WM_PAINT и ручной отрисовке заголовков вкладок. Этот подход работает только для Windows, поскольку использует специфичные для этой ОС API.
Шаги реализации:
Создание потомка от TPageControl: Необходимо создать собственный класс-потомок от TPageControl (или TExtendedNotebook, если вы используете его напрямую).
Перехват сообщения WM_PAINT: В новом классе переопределите обработчик сообщения WM_PAINT.
Ручная отрисовка заголовков: В обработчике 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