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

Aero-тема в Windows 7


Вадим Смоленский

Вопрос

Один тестер моего проекта (один изо всей команды!) поставил меня в полный тупик. У него Windows 7, и он запускает приложение на разных компьютерах, выбирая разные темы - то с Aero, то без. Почему-то приложение выглядит у него прилично лишь при запуске с Aero; при запуске же с базовой темой наблюдаются искажения отрисовки и функциональные нарушения. А на одном компьютере с Aero-темой приложение может не запуститься вовсе: например, если установлено системное масштабирование шрифтов 135%. Тогда при запуске появляется сообщение об ошибке в модуле ntdll.dll.

Не мог бы кто-нибудь разъяснить, как установка темы связана с параметрами Windows API? Можно ли как-то нивелировать эту разницу? На что вообще в таких случаях нужно обратить внимание?

Ссылка на комментарий

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

  • 0

Отвечаю на свой вопрос сам - вдруг кому пригодится. Наличие или отсутствие aero-темы при запуске можно определить следующим образом:

function IsThisAero: Boolean;
type
  TDwmIsCompositionEnabledFunc = function(out pfEnabled: BOOL): HRESULT; stdcall;
var
  IsEnabled: BOOL;
  ModuleHandle: HMODULE;
  DwmIsCompositionEnabledFunc: TDwmIsCompositionEnabledFunc;
begin
  Result := False;
  if Win32MajorVersion>=6 then // Vista or Windows 7+
     begin
      ModuleHandle := LoadLibrary('dwmapi.dll');
      if ModuleHandle <> 0 then
         try
          @DwmIsCompositionEnabledFunc := GetProcAddress(ModuleHandle, 'DwmIsCompositionEnabled');
          if Assigned(DwmIsCompositionEnabledFunc) then
           if DwmIsCompositionEnabledFunc(IsEnabled) = S_OK then
            Result := IsEnabled;
         finally
          FreeLibrary(ModuleHandle);
         end;
     end;
end;

Критичным в моем случае оказалось то, что при запуске без aero-темы, но с экранным масштабированием многое масштабируется по-другому. Точнее сказать, одно масштабируется, а другое нет. Соответственно, чтобы компоненты приложения выравнивались, как задумано, приходится в разных ситуациях применять два разных коэффициента: один всегда равен экранному масштабу, а другой - только при запусках с aero; при запусках же без aero обращается в единицу. Всё это выходит довольно запутанно, часто при выборе коэффициента мне приходилось действовать методом тыка. Но в итоге добиился того, что приложение выглядит более-менее одинаково в обоих вариантах запуска.

Ссылка на комментарий
  • 0

Чтобы отключить масштабирование в Windows, в FMX, нужно 

Project > View Source

До строки  Application.Initialize; вставить строку

GlobalUseGPUCanvas := true;

GlobalUseGPUCanvas := true;
Application.Initialize;

Этот рендер по дефолту включается на Mac, Android и iOS. 

Изменено пользователем ENERGY
Ссылка на комментарий
  • 0
4 часа назад, ENERGY сказал:

GlobalUseGPUCanvas := true;

Была у меня эта строчка одно время вставлена. Пришлось убрать, ибо при запусках без aero (в частности, под Windows XP) она приводила к неприемлемым искажениям текста, выводимого на TImage.Bitmap.Canvas.

Ссылка на комментарий

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

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

Гость
Ответить на вопрос...

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

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

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

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

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

×
×
  • Создать...