Изменение цвета Group-box и Radio Group в Delphi 2006 с помощью XPManifest
При работе с Delphi 2006 пользователи могут столкнуться с проблемой изменения цвета Group-box и Radio Group captions, так как они всегда отображаются в синем цвете. Однако, если в проекте присутствует XPManifest, это можно изменить, переопределив метод Paint TGroupBox.
Подтвержденный ответ заключается в том, что переопределение метода Paint TGroupBox является единственным способом изменить цвет Group-box и Radio Group captions в Delphi 2006 с помощью XPManifest. Ниже приведен пример кода, который использует класс Interposer для достижения этой цели:
type
TGroupBox = class(StdCtrls.TGroupBox) // объявить это перед определением формы
public
procedure Paint; override;
end;
uses
Themes;
{ TGroupBox }
procedure TGroupBox.Paint;
var
H: Integer;
R: TRect;
Flags: Longint;
CaptionRect,
OuterRect: TRect;
Size: TSize;
Box: TThemedButton;
Details: TThemedElementDetails;
begin
with Canvas do
begin
Font := Self.Font;
if ThemeServices.ThemesEnabled then // если функция ThemeControl не существует в Delphi 2006, используйте ThemeServices.ThemesEnabled
begin
if Text <> '' then
begin
GetTextExtentPoint32(Handle, PChar(Text), Length(Text), Size);
CaptionRect := Rect(0, 0, Size.cx, Size.cy);
if not UseRightToLeftAlignment then
OffsetRect(CaptionRect, 8, 0)
else
OffsetRect(CaptionRect, Width - 8 - CaptionRect.Right, 0);
end
else
CaptionRect := Rect(0, 0, 0, 0);
OuterRect := ClientRect;
OuterRect.Top := (CaptionRect.Bottom - CaptionRect.Top) div 2;
with CaptionRect do
ExcludeClipRect(Handle, Left, Top, Right, Bottom);
if Enabled then
Box := tbGroupBoxNormal
else
Box := tbGroupBoxDisabled;
Details := ThemeServices.GetElementDetails(Box);
// Нарисуйте оформленный контур
ThemeServices.DrawElement(Handle, Details, OuterRect);
SelectClipRgn(Handle, 0);
if Text <> '' then
begin
H := TextHeight('0');
if not UseRightToLeftAlignment then
R := Rect(8, 0, 0, H)
else
R := Rect(R.Right - Canvas.TextWidth(Text) - 8, 0, 0, H);
Flags := DrawTextBiDiModeFlags(DT_SINGLELINE);
//Теперь используйте Windows.DrawText
DrawText(Handle, PChar(Text), Length(Text), R, Flags or DT_CALCRECT);
Brush.Color := Color; // фоновый цвет подписи
Font.Color := clRed; // цвет подписи.
DrawText(Handle, PChar(Text), Length(Text), R, Flags);
end;
end
else
inherited; // если элемент не оформлен, используйте исходный метод Paint.
end;
end;
Примечания:
Если функция ThemeControl не найдена, используйте ThemeServices.ThemesEnabled вместо ThemeControl(Self).
Чтобы фон текста был таким же, как фон формы (который является изображением в данном случае), установите свойство Color TGroupBox на тот же цвет, что и у формы. Если это не работает, можно установить цвет фона в этой строке кода: Brush.Color := Color; (прочтите комментарии в коде).
Альтернативный ответ:
В Delphi 2006 нет встроенной поддержки изменения цвета Group-box и Radio Group captions с помощью XPManifest. Однако, переопределив метод Paint TGroupBox, можно добиться желаемого результата.
При работе с Delphi 2006 для изменения цвета Group-box и Radio Group captions с помощью XPManifest необходимо переопределить метод Paint TGroupBox.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.