是否有一种方法可以在不使用任何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;
之所以糟糕,是因为
- 它使用了隐藏的 TWebBrowser 控件,但我想通过 IHTMLDocument 接口直接加载 HTML 文档,并在自己的画布上呈现特定的元素
- 如果我手动创建并加载 IHTMLDocument,例如 这种方式,那么渲染器方法 IHTMLElementRender.DrawToDC 就不会绘制任何内容(可能是因为没有用于呈现文档的画布)
- 更糟糕的是,IHTMLElementRender.DrawToDC 在此时已被弃用,因此我正在寻找一种在自己的画布上呈现元素的替代方法
是否有一种干净的方法使用 MSHTML 解决这个问题?
IHTMLElement
不支持IViewObject
。 - TLamaIHTMLDocument
,但它也会绘制 WB 边框... :/ 我还尝试使用“htmlfile”ole对象,但它不会在输出画布上绘制任何东西... 如果在IE9中DrawToDC已被弃用,则您可能应该使用第三方解决方案,如“THtmlViewer”。 - kobikSetHtml
作为字符串方法,而不是使用Navigate。在我看来,这是无法在不使用TWebBrowser的情况下完成的。响应HTML取决于CSS,可以通过JS动态创建等方式生成...因此,TWebBrowser控件(Internet Explorer_Server
HWND)正在呈现页面。我认为你的解决方案已经足够好了(如果它只是你的应用程序中的一个小功能)。 - kobik