如何在不使用网络浏览器的情况下渲染 HTML 元素?
有没有一种方法可以在画布上绘制特定的 HTML 元素内容而不使用任何 Web 浏览器控件?
使用此代码,我将元素渲染到表单的画布上(仅作为示例)。
它虽然有效,但这段代码不是一个好的做法 - 请参见下文,为什么...
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 界面并在我的自己的画布,
- 如果我创建并加载 IHTMLDocument 手动,例如 这样然后渲染器方法IHTMLElementRender.DrawToDC 不绘制任何内容(也许是因为没有画布用于渲染文档)
- 更糟糕的是 IHTMLElementRender.DrawToDC 目前已弃用,所以我正在寻找一种在我自己的画布上渲染元素的替代方法
是否有一种干净的方法可以使用 MSHTML 来解决这个问题?
Is there a way how to draw specific HTML element content on a canvas without using any web browser control ?
With this code I'm rendering the element to the form's canvas (just as an example).
It works though, but this code is not a good practice - see below, why...
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;
It's bad because
- it uses the hidden TWebBrowser control, but I would like to load the HTML document directly through the IHTMLDocument interface and render certain element on my own canvas
- if I create and load the IHTMLDocument manually e.g. this way then the renderer method IHTMLElementRender.DrawToDC doesn't paint anything (maybe because there's no canvas for rendering of the document)
- even worse is that IHTMLElementRender.DrawToDC is deprecated at this time, so I'm looking for an alternative method for rendering elements on my own canvas
Is there a clean way to solve this using MSHTML ?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
DrawToDC 和 IViewObject 都需要 TWebBrowser 控件将文档实际呈现为目标直流。
DrawToDC and IViewObject both require the TWebBrowser control to actually render the document into a target DC.
也许你可以尝试 THtmlViewer?
http://code.google.com/p/thtmlviewer/
Maybe you can try THtmlViewer?
http://code.google.com/p/thtmlviewer/
请参阅 tms-software 的 THTMLabel
See THTMLabel from tms-software