Использование компонента TWebBrowser в RAD Studio Rio с поддержкой High DPI: автоматический масштаб и решение проблемы с масштабированием
Разработка приложений с поддержкой высокого разрешения (High DPI) становится все более актуальной, поскольку современные устройства часто имеют высокое разрешение экрана. В RAD Studio Rio поддержка High DPI включена по умолчанию для большинства компонентов VCL, но компонент TWebBrowser требует дополнительной настройки для корректной работы с высоким разрешением.
Проблема
Пользователи RAD Studio Rio сталкиваются с проблемой, когда интерфейс и компоненты приложения корректно масштабируются при перемещении между дисплеями с разным разрешением, но содержимое TWebBrowser остается неизменным. Это связано с тем, что TWebBrowser обертка над Internet Explorer, и его масштабирование управляется отдельно от VCL компонентов.
Решение
Для решения проблемы с масштабированием содержимого TWebBrowser в приложениях, созданных с использованием RAD Studio Rio, можно использовать два подхода:
Способ 1: Настройка через реестр Windows
Можно включить поддержку FEATURE_96DPI_PIXEL для вашего приложения через реестр. Для этого необходимо создать функцию, которая будет изменять значение в реестре:
procedure EnableDpiAwareness;
var
Reg: TRegistry;
App: string;
begin
Reg := TRegistry.Create;
try
App := ExtractFileName(Application.ExeName);
Reg.RootKey := HKEY_CURRENT_USER;
if Reg.OpenKey('Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_96DPI_PIXEL', True) then
begin
Reg.WriteInteger(App, 1);
Reg.CloseKey;
end;
finally;
Reg.Free;
end;
end;
Способ 2: Реализация класса IDocHostUIHandler
Создать класс-потомок TWebBrowser, который реализует интерфейс IDocHostUIHandler. В этом классе необходимо переопределить функцию GetHostInfo, добавив флаг DOCHOSTUIFLAG_DPI_AWARE:
unit DpiAwareWebBrowser;
interface
uses
Winapi.Mshtmhst,
SHDocVw;
type
TDpiAwareWebBrowser = class(TWebBrowser, IDocHostUIHandler)
strict private
// IDocHostUIHandler "override"
function GetHostInfo(var pInfo: TDocHostUIInfo): HRESULT; stdcall;
end;
implementation
const
DOCHOSTUIFLAG_DPI_AWARE = $40000000;
function TDpiAwareWebBrowser.GetHostInfo(var pInfo: TDocHostUIInfo): HRESULT;
begin
// оригинальный код из TWebBrowser.GetHostInfo
pInfo.cbSize := SizeOf(pInfo);
pInfo.dwFlags := 0;
pInfo.dwFlags := pInfo.dwFlags or DOCHOSTUIFLAG_NO3DBORDER;
pInfo.dwFlags := pInfo.dwFlags or DOCHOSTUIFLAG_THEME;
pInfo.dwFlags := pInfo.dwFlags or DOCHOSTUIFLAG_DPI_AWARE; // новый добавленный флаг
Result := S_OK;
// ResizeScrollBars; // будет вызвано последующими рутинами в любом случае.
end;
end.
Оба способа позволяют TWebBrowser автоматически масштабироваться в соответствии с разрешением экрана.
Заключение
Для обеспечения корректной работы TWebBrowser в приложениях с поддержкой High DPI, необходимо использовать один из предложенных методов. Это позволит содержимому TWebBrowser масштабироваться автоматически при перемещении приложения между дисплеями с различным разрешением.
Разработчики RAD Studio Rio сталкиваются с необходимостью настройки компонента `TWebBrowser` для автоматического масштабирования и корректной работы с высоким разрешением экрана.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.