Перейти к содержанию
Fire Monkey от А до Я
  • 0

А как сделать то, что раньше работало как реакция на WM_SETTINGCHANGE?


Vasya

Вопрос

Опубликовано (изменено)

Приветствую товарищи!

Каким образом на FMX сделать динамическую реакцию на изменение цветовой схемы Windows (светлая/тёмная)? В VCL это делалось через обработку WM_SETTINGCHANGE, но здесь же нет хендлеров...

И как грамотно загружать саму схему?

 

Кстати, может, кому пригодится - рамку окна можно менять с помощью https://github.com/HemulGM/WindowDarkMode. Но только рамку.

Изменено пользователем Vasya

Рекомендуемые сообщения

  • 0
Опубликовано (изменено)

Хендлер делается несложно, создаешь его и вешаешь свой обработчик сообщений

type
  TMyForm = class(TForm)
  private
  {$IFDEF MSWINDOWS}
    // Сохраненный обработчик сообщений окна
    FPrevWndProc: TFNWndProc;

    // Установленный обработчик сообщений окна
    FWndProc: Pointer;

    // Обработчик сообщений окна
    procedure FormWndProc(var AMsg: Winapi.Messages.TMessage);
  {$ENDIF}
  protected
  {$IFDEF MSWINDOWS}
    procedure CreateHandle; override;
  {$ENDIF} 
  end;

{$IFDEF MSWINDOWS}

procedure TMyForm.FormWndProc(var AMsg: Winapi.Messages.TMessage);
begin
  case AMsg.Msg of
    WM_SETTINGCHANGE:
    begin
      // смотрим наличие ImmersiveColorSet в сообщении и включаем нужную тему из нужного StyleBook на форме
    end;
  end;

  AMsg.Result := CallWindowProc(FPrevWndProc, FormToHWND(Self), AMsg.Msg, AMsg.WParam, AMsg.LParam);
end;

procedure TMyForm.CreateHandle;
begin
  inherited;

  var LHandle: HWND := FormToHWND(Self);
  FPrevWndProc := TFNWndProc(GetWindowLong(LHandle, GWL_WNDPROC));
  FWndProc := MakeObjectInstance(FormWndProc);
  SetWindowLong(LHandle, GWL_WNDPROC, NativeInt(FWndProc));
end;

{$ENDIF}

 

Изменено пользователем Tumaso
  • 0
Опубликовано (изменено)
29 минут назад, Tumaso сказал:

Хендлер делается несложно, создаешь его и вешаешь свой обработчик сообщений

Ох ничего себе... как на голом API... Я думал, есть какой продуманный способ.

А вот что-то в духе https://docwiki.embarcadero.com/Libraries/Sydney/en/FMX.Platform.IFMXSystemAppearanceService, но чтобы событие было, не существует в FMX? Вообще, странно, что в такой мощнейшей библиотеке через API надо делать такую очевидную потребность.

А "включаем нужную тему" - можно поподробнее? Что там за темы? Там же стили только.

Изменено пользователем Vasya

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...