type
TMyPanel = class(TPanel)
public
constructor Create(AOwner: TComponent); override;
end;
{ TMyPanel }
constructor TMyPanel.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
if ThemeServices.ThemesEnabled then
ControlStyle := ControlStyle - [csParentBackground] + [csOpaque];
end;
procedure TForm1.FormCreate(Sender: TObject);
var
R: TRect;
begin
with TMyPanel.Create(Self) do
begin
Parent := Self;
Color := clGreen;
R := Panel1.BoundsRect;
R.Left := R.Left + 300;
R.Right := R.Right + 300;
BoundsRect := R;
end;
end;
В первом коде, автор пытается создать пользовательский панель с зеленым фоном, используя класс TMyPanel, который наследуется от TPanel. Однако, проблема заключается в том, что свойство ControlStyle не настроено корректно.
В обработчике события FormCreate формы TForm1 создается новый экземпляр TMyPanel и его свойства настраиваются. Однако, когда панель отображается, она будет наследовать стандартный вид темы, потому что свойство ControlStyle не правильно переопределяется для исключения рисования фона родительского элемента.
Чтобы решить эту проблему, можно настроить свойство ControlStyle явно в конструкторе TMyPanel, как показано ниже:
Это обеспечит, что фон панели будет рисоваться с указанным цветом (в этом случае clGreen) вместо наследования стандартного вида темы.
Второй код-снippet автор пытается отключить тему XP для конкретных контролов, используя процедуру Unload2Themes. Это подход несколько хакерский и может не работать как ожидалось в всех случаях.
Идея этого кода заключается в отправке пользовательского сообщения (WM_USER + 1) в процедуру окна формы, которая затем вызывает процедуру Unload2Themes. Эта процедура настраивает тему для конкретных контролов с помощью функции SetWindowTheme из библиотеки uxtheme.dll.
Однако, этот подход имеет несколько ограничений:
Он требует, чтобы библиотека uxtheme.dll была установленной и доступной на системе.
Он может не работать правильно, если контролы размещены в контейнерном элементе (например, панели или групповой ячейке).
Это немного инвазивный подход, потому что он изменяет настройки темы для конкретных контролов.
В целом, я бы рекомендовал использовать первый подход (переопределение свойства ControlStyle) для достижения желаемого вида для вашего пользовательского панели. Если вам нужно более тонкое управление темой, вы можете хотеть рассмотреть использование третьей-сторонней библиотеки или создать свой собственный движок темы с нуля.
Статья рассказывает о способах отключения стиля XP для отдельных контролов на форме в Delphi.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.