Как сделать TWebBrowser Zoom при использовании Ctrl + колесико мыши, как это делает Internet Explorer?

В соответствии с

http://www.rendelmann.info/blog/CommentView,guid,356fbe68-3ed6-4781-90a4-57070a0141da.aspx и http://msdn.microsoft.com/en-us/library/aa770056(v=vs.85).aspx

получение размещенного веб-браузера для масштабирования с помощью клавиши управления и колесика мыши должно просто требовать вызова IWebBrowser2.ExecWB(OLECMDID_OPTICAL_ZOOM, ...) со значением pvaIn 100,
но после его вызова Ctrl + колесико мыши по-прежнему не масштабирует содержимое

Код, который я использую с Delphi 2007:

const
  OLECMDID_OPTICAL_ZOOM = 63;
var
  pvaIn, pvaOut: OleVariant;
begin
  pvaIn := 100;
  pvaOut := NULL;
  WebBrowser1.ControlInterface.ExecWB(OLECMDID_OPTICAL_ZOOM,
    OLECMDEXECOPT_DONTPROMPTUSER, pvaIn, pvaOut);
end;

person jasonpenny    schedule 20.04.2012    source источник
comment
Комментарий наполовину не по теме. Вы пробовали TEmbeddedWB, чтобы увидеть, помогает ли это?   -  person Graymatter    schedule 01.08.2012
comment
@jasonpenny: 100 — это размер по умолчанию (100%), вы пробовали большее значение, например 120 или 200?   -  person Cesar Romero    schedule 02.08.2012
comment
Я пробовал TEmbeddedWB, он не работает, даже с DOCHOSTUIFLAG_DPI_AWARE. И проблема в том, что MSDN говорит, что элемент управления будет автоматически обрабатывать масштабирование с помощью CTRL+mouse wheel forward/back после установки на 100; явная установка масштаба со значением, отличным от 100, показывает увеличенное содержимое страницы.   -  person jasonpenny    schedule 02.08.2012
comment
@jasonpenny Я не уверен, как обстоят дела в Delphi 2007, но в Delphi 7 события колесика мыши не всегда отправляются в элементы управления.   -  person Marck    schedule 08.08.2012


Ответы (2)


Джейсонпенни,

100 — это значение по умолчанию, если вы хотите изменить масштаб, вы должны увеличить или уменьшить это значение от 10 до 1000.

Я написал тест, и вот код:

type
  TFormWebBrowserZoom = class(TForm)
    WebBrowser1: TWebBrowser;
    procedure FormMouseWheelDown(Sender: TObject; Shift: TShiftState; MousePos: TPoint; var Handled: Boolean);
    procedure FormMouseWheelUp(Sender: TObject; Shift: TShiftState; MousePos: TPoint; var Handled: Boolean);
    procedure FormShow(Sender: TObject);
  private
    FZoom: Integer;
    FLastZoom: Integer; 

    procedure ApplyZoom(ZoomValue: Integer);
    procedure DecZoom;
    procedure IncZoom;
  end;

implementation

const
  OLECMDID_OPTICAL_ZOOM = $0000003F;
  MinZoom = 10;
  MaxZoom = 1000;
  ZoomFactor = 20;
  DefaultZoom = 100;

procedure TFormWebBrowserZoom.FormShow(Sender: TObject);
begin
  WebBrowser1.Navigate('http://www.cesarromero.com.br');
  FZoom := DefaultZoom;
  FLastZoom := DefaultZoom;
end;

procedure TFormWebBrowserZoom.ApplyZoom(ZoomValue: Integer);
var
  pvaIn, pvaOut: OleVariant;
begin
  if ZoomValue = FLastZoom then
    Exit;
  FLastZoom := ZoomValue;
  pvaIn := ZoomValue;
  pvaOut := Null;
  WebBrowser1.ControlInterface.ExecWB(OLECMDID_OPTICAL_ZOOM, OLECMDEXECOPT_DONTPROMPTUSER, pvaIn, pvaOut);
end;

procedure TFormWebBrowserZoom.DecZoom;
begin
  System.Dec(FZoom, ZoomFactor);
  if FZoom < MinZoom then
    FZoom := MinZoom;
  ApplyZoom(FZoom);
end;

procedure TFormWebBrowserZoom.IncZoom;
begin
  System.Inc(FZoom, ZoomFactor);
  if FZoom > MaxZoom then
    FZoom := MaxZoom;
  ApplyZoom(FZoom);
end;

procedure TFormWebBrowserZoom.FormMouseWheelDown(Sender: TObject; Shift: TShiftState; MousePos: TPoint; var Handled: Boolean);
begin
  DecZoom;
end;

procedure TFormWebBrowserZoom.FormMouseWheelUp(Sender: TObject; Shift: TShiftState; MousePos: TPoint; var Handled: Boolean);
begin
  IncZoom;
end;
person Cesar Romero    schedule 02.08.2012
comment
Я предполагаю, что код в вопросе не относится к событию MouseWheel. Что я понял, так это то, что вопрос спрашивает, почему после звонка веб-браузер автоматически не регулирует масштаб сам. - person Sertac Akyuz; 02.08.2012
comment
@Sertac Akyuz: Точно, и я только что опубликовал рабочий код, пожалуйста, проверьте, изменил ли я значение pvaIn := 200; - person Cesar Romero; 02.08.2012
comment
Приведенный выше код Цезаря НЕ компилируется, поскольку у него та же самая процедура TFormWebBrowserZoom.DecZoom; заявлено дважды! - person user1527613; 06.07.2013
comment
@ user1527613: Это простая опечатка, и чтение кода ясно показывает, что вместо второго DecZoom должно быть IncZoom. Я отредактировал, чтобы исправить эту проблему и переместить объявления const из объявления типа формы и пометил их как принадлежащие разделу implementation вместо более старых версий Delphi. - person Ken White; 07.07.2013

С http://msdn.microsoft.com/en-us/library/cc849094%28v=vs.85%29.aspx#OptInHighDPI:

Увеличение размера Интернета: масштабирование DPI и Интернет Проводник 8

Включение режима высокого разрешения для элементов управления веб-браузера (WebOC)

Чтобы сохранить совместимость с ранее разработанными WebOC, по умолчанию Internet Explorer 8 не отображает веб-контент WebOC с использованием поведения Internet Explorer 8 High DPI, а использует поведение Internet Explorer 7, которое масштабирует шрифты, указанные в абсолютных значениях. например точки. Чтобы воспользоваться преимуществами поведения Internet Explorer 8 High DPI в своих программах, необходимо использовать DOCHOSTUIFLAG с именем DOCHOSTUIFLAG_DPI_AWARE. Этот флаг используется с помощью метода GetHostInfo, который содержит DOCHOSTUIINFO. структура как один из его параметров. В свою очередь DOCHOSTUIINFO имеет оператор DWORD с именем dwFlags в качестве одного из своих членов, который может состоять из одного или нескольких значений DOCHOSTUIFLAG. Вы должны включить DOCHOSTUIFLAG_DPI_AWARE в dwFlags, чтобы воспользоваться преимуществом поведения Internet Explorer 8 с высоким разрешением в вашем WebOC.

Быстрый и простой способ смоделировать, как будет выглядеть HTML-контент ваших WebOC после выбора режима High-DPI, — открыть эквивалентный HTML-контент (составленный в HTML-файле) в Internet Explorer 8 и просто проверить рендеринг с эквивалентными настройками масштабирования (от 120 DPI до 125% увеличения, от 144 DPI до 150% увеличения). Мы рекомендуем вам протестировать WebOC в реальных сценариях с высоким разрешением, чтобы быть полностью уверенным, что содержимое HTML отображается так, как вы надеялись.

person Ian Boyd    schedule 08.05.2012
comment
У вас есть работающий образец? Добавление pInfo.dwFlags := pInfo.dwFlags or {DOCHOSTUIFLAG_DPI_AWARE} $40000000; в TEmbeddedWB.GetHostInfo не включает масштабирование с помощью Ctrl+Колесо мыши - person jasonpenny; 09.05.2012