如何让 Delphi TWebBrowser 组件缩放以适应显示器 DPI?

问题描述 投票:0回答:1

我构建了一个简单的 Delphi 程序来测试 Martin Schneider 在 StackOverflow 上提供的两个解决方案:

启用 TWebBrowser 高 DPI 支持

...但是当程序被拖到缩放到175%的显示器上时,页面内容仍然未缩放。

这是我的 Martin 的“解决方案 2”的代码:

unit Unit1;

interface

  uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes,
  Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, System.IOUtils,
  Vcl.StdCtrls, Vcl.ExtCtrls, ShellAPI, Vcl.ComCtrls, Vcl.ToolWin, System.StrUtils,
  ShlObj, System.UITypes, Vcl.OleCtrls, SHDocVw,
  Winapi.Mshtmhst;

  type
  TDpiAwareWebBrowser = class(TWebBrowser, IDocHostUIHandler)
    strict private
      // IDocHostUIHandler "override"
      function GetHostInfo(var pInfo: TDocHostUIInfo): HRESULT; stdcall;
  end;

  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
  public
  end;

  var
  Form1: TForm1;

implementation
  {$R *.dfm}

  const
  DOCHOSTUIFLAG_DPI_AWARE = $40000000;

function TDpiAwareWebBrowser.GetHostInfo(var pInfo: TDocHostUIInfo): HRESULT;
begin
  // original code from 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; // NEW added flag
  Result := S_OK;
  //ResizeScrollBars; // will be called by subsequent routines anyway.
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  var wb:= TDpiAwareWebBrowser.Create(Form1);
  TWinControl(wb).Parent:= Form1;
  wb.align:= alClient;
  wb.Navigate('https://google.com');
end;

end.

在此屏幕截图中,您可以看到测试程序的标题栏对于设置为 175% 的显示器进行了正确缩放,但基于 TWebBrowser 的组件却没有:

TwebBrowser not scaled

这是显示显示器缩放比例的屏幕截图:

monitor scaling

我还实现了 Martin 的“解决方案 1”,如 Windows 注册表的屏幕截图所示:

registry key for FEATURE_960DPI_PIXEL

我正在使用Delphi 11

Delphi 11

我正在 VMware Workstation 16 Pro 虚拟机内的 Windows 10 上进行开发。

为了响应 SilverWarior 的建议,我尝试通过下面的 Windows 注册表 FEATURE_BROWSER_EMULATION 键添加浏览器模拟。遗憾的是,浏览器内容在任何情况下都不会缩放到显示器的 dpi。

testing browser emulation by registry

接下来,我尝试通过 Meta Tag 进行浏览器模拟。在任何情况下,浏览器内容都无法正确缩放。

browser emulation by Meta Tag

我错过了什么?

delphi twebbrowser delphi-11-alexandria
1个回答
0
投票

将您的 TWebBrowser 切换到 Edge 引擎,它具有对 HiDPI 和许多其他功能的现代支持。详细信息:http://docwiki.embarcadero.com/RADStudio/en/Using_TEdgeBrowser_Component_and_Changes_to_the_TWebBrowser_Component

另外,不要忘记在安装应用程序期间运行 WebView2 安装程序。详细信息请参见:https://learn.microsoft.com/en-us/microsoft-edge/webview2/concepts/distribution

© www.soinside.com 2019 - 2024. All rights reserved.