Как сделать WebBrowser для контекста устройства?
я хочу сделать веб-страницу (т.е.TWebBrowser
) к контексту устройства. я хочу использовать механизм компоновки Internet Explorer для рендеринга контента в контекст устройства (т. е. метафайл, метафайл pdf).
Начиная с Internet Explorer 9 theIHTMLElementRender
интерфейс больше не Поддерживается:
Используйте этот интерфейс для рисования содержимого элемента в указанном контексте устройства, обычно в принтере.
Пользователи
The IHTMLElementRender интерфейс наследуется от IUnknown интерфейс, но не имеет дополнительных членов.
До такой степени, что они больше не упоминают, чтоDrawToDC метод даже существует:
IHTMLElementRender :: Метод DrawToDCDeprecated. Рисует содержимое элемента в указанном контексте устройства.
Синтакси
HRESULT DrawToDC(
HDC hDC
);
Параметры
HDC[in] An HDC с указанием устройства, к которому нужно обращаться, обычно это принтер.
Возврат стоимости
Возвращает S_OK в случае успеха или значение ошибки в противном случае.
Примечания
В Windows Internet Explorer 9 этот метод устарел и не должен использоваться.
С некоторыми принтерами, работающимиIHTMLElementRender :: DrawToDC может вызвать проблемы. Вы можете убедиться, чтоIHTMLElementRender :: DrawToDC правильно работает на всех принтерах, запустивIHTMLElementRender :: SetDocumentPrinterначала метод @, а затем передача измененного контекста устройства вIHTMLElementRender :: DrawToDC.
Заметк: Я цитирую всю документацию, чтобы ее можно было найти, когда Microsoft окончательно удалит ее из MSDN. Вместе с объявлением интерфейса:
IHTMLElementRender = interface(IUnknown)
['{3050F669-98B5-11CF-BB82-00AA00BDCE0B}']
function DrawToDC(hdc: HDC): HResult; stdcall;
function SetDocumentPrinter(const bstrPrinterName: WideString; hdc: HDC): HResult; stdcall;
end;
ИспользоватьIViewObject
интерфейс Я пытался конвертировать, чтобы использоватьIViewObject
(например, Как отобразить HTML-элемент без использования веб-браузера?):
procedure RenderWebBrowserToMetafile(Browser: TWebBrowser; Metafilename: string);
var
view: IViewObject;
m: TMetafile;
mc: TMetafileCanvas;
w, h: Integer;
r: TRect;
dpix: Integer;
dpiy: Integer;
dc: HDC;
begin
w := WebBrowserScrollWidth(Browser);
h := WebBrowserScrollHeightStrict(Browser);
//96dpi screen to 300dpi metafile (destined for printer)
dc := GetDC(0);
try
dpix := GetDeviceCaps(GetDC(0), LOGPIXELSX);
dpiy := GetDeviceCaps(GetDC(0), LOGPIXELSY);
finally
ReleaseDC(0, dc);
end;
w := MulDiv(w, 300, dpix);
h := MulDiv(h, 300, dpiy);
view := Browser.Document as IViewObject;
m := TMetafile.Create;
try
m.Width := w;
m.Height := h;
r := Rect(0, 0, w, h);
mc := TMetafileCanvas.Create(m, 0);
try
view.Draw(
DVASPECT_CONTENT, //draw aspect
1, //index
nil, //pAspectInfo
nil, //pDVTargetDevice
0, //Target Device Context
mc.handle, //hdcDraw
@r, //target Bounds
@w, //window bounds (for metafiles)
nil, //continue function
0); //continue value
finally
mc.Free;
end;
m.SaveToFile(Metafilename);
finally
m.Free;
end;
end;
Проблема с этим кодом в том, что он отображает только Видимым область браузера (т.е. без прокручиваемого содержимого):
мне нужно сделать Весь веб-страница (например, для печати).
я пытался изменить рисовать аспект отDVASPECT_CONTENT
(как этот пример делает), чтобыDVASPECT_DOCPRINT
:
DVASPECT_DOCPRINT
Предоставляет представление объекта на экране, как если бы оно было напечатано на принтере с помощью команды «Печать» из меню «Файл». Описанные данные могут представлять собой последовательность страниц.
С таким же результатом; вместо отображения страницы отображается только видимая часть:
Как я могу попросить рендеринг движка IE9?
я также пытался использовать разные Индексы вместе сDVASPECT_DOCPRINT
. ХотяIViewObject
не документировано, может быть, так вы печатаете разные "Страница":
view.Draw(DVASPECT_DOCPRINT, 1, ...);
view.Draw(DVASPECT_DOCPRINT, 2, ...);
view.Draw(DVASPECT_DOCPRINT, 3, ...);
...
view.Draw(DVASPECT_DOCPRINT, n, ...);
Но веб-браузеру все равно, что это за индекс; только рендеринг текущегоView
(что, я думаю, имеет смысл при использованииIViewObject
).
Как отобразить браузер в контексте устройства?
Заметк: Вопрос помечен какdelphi
, но в этом вопросе нет ничего, что было бы Дельфи конкретный
Обновит: я также пробовал другие комбинации Аспект а такжепоказател:
view.Draw(DVASPECT_CONTENT, -1, ...);
view.Draw(DVASPECT_DOCPRINT, -1, ...);
view.Draw(DVASPECT_CONTENT, 0, ...);
view.Draw(DVASPECT_DOCPRINT, 0, ...);