如何在不使用Web浏览器的情况下呈现HTML元素?

15

是否有一种方法可以在不使用任何Web浏览器控件的情况下,在画布上绘制特定的HTML元素内容?

使用以下代码,我将元素呈现到表单的画布上(仅作为示例)。
虽然它有效,但这段代码不是良好的实践 - 请看下面的原因...

uses
  SHDocVw, MSHTML;

procedure TForm1.Button1Click(Sender: TObject);
var
  WebBrowser: TWebBrowser;
  HTMLElement: IHTMLElement;
  HTMLRenderer: IHTMLElementRender;
begin
  WebBrowser := TWebBrowser.Create(nil);
  try
    WebBrowser.ParentWindow := Application.Handle;
    WebBrowser.Navigate('https://stackoverflow.com/questions/2975586/good-delphi-blogs');

    while WebBrowser.ReadyState < READYSTATE_COMPLETE do
      Application.ProcessMessages;

    HTMLElement := (WebBrowser.Document as IHTMLDocument3).getElementById('question');
    HTMLRenderer := (HTMLElement as IHTMLElementRender);
    HTMLRenderer.DrawToDC(Canvas.Handle);

  finally
    HTMLElement := nil;
    HTMLRenderer := nil;
    WebBrowser.Free;
  end;
end;

之所以糟糕,是因为

是否有一种干净的方法使用 MSHTML 解决这个问题?


5
你尝试过嵌入Chromium吗?可以使用http://code.google.com/p/delphichromiumembedded,里面有一个离屏渲染组件。 - Henri Gourvest
谢谢回复,但我想尽量避免使用第三方控件(即使它们可能更好)。我想使用纯MS界面解决方案。很遗憾IHTMLElement不支持IViewObject - TLama
1
“badly hidden”是什么意思?为什么不直接使用TWebBrowser?如果Chromium支持在画布上绘制,为什么不使用它呢? - Marcus Adams
@TLama,我想知道你想做什么?你想打印文档吗?提供预览?我已经成功手动加载了 IHTMLDocument,但它也会绘制 WB 边框... :/ 我还尝试使用“htmlfile”ole对象,但它不会在输出画布上绘制任何东西... 如果在IE9中DrawToDC已被弃用,则您可能应该使用第三方解决方案,如“THtmlViewer”。 - kobik
@TLama,我所说的“手动”是指使用SetHtml作为字符串方法,而不是使用Navigate。在我看来,这是无法在不使用TWebBrowser的情况下完成的。响应HTML取决于CSS,可以通过JS动态创建等方式生成...因此,TWebBrowser控件(Internet Explorer_Server HWND)正在呈现页面。我认为你的解决方案已经足够好了(如果它只是你的应用程序中的一个小功能)。 - kobik
显示剩余4条评论
3个回答

3

DrawToDC和IViewObject都需要TWebBrowser控件将文档实际呈现到目标DC中。


1
就像我承诺的那样,加上+1 :) 无论如何,有趣的音乐制作,我听过你的一些曲目,我喜欢它。它听起来非常像Depeche Mode。 - TLama

1

1
瞬间被抓取!这些代码可以工作,但可能会在大多数现代 AJAX 页面上出现问题。 - Leonardo Herrera
谢谢,但我真的在寻找来自微软的IHTMLElementRender.DrawToDC替代方案(如果有的话)。 - TLama

1

我很感谢你的回答,但不幸的是 THTMLabel 没有源代码并且需要付费,而且我敢打赌它有自己的解析和渲染系统。我真的专注于 MS 接口。 - TLama

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接