Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在不使用web浏览器的情况下呈现HTML元素?_Html_Delphi_Mshtml_Ihtmldocument - Fatal编程技术网

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

如何在不使用web浏览器的情况下呈现HTML元素?,html,delphi,mshtml,ihtmldocument,Html,Delphi,Mshtml,Ihtmldocument,有没有一种方法可以在画布上绘制特定的HTML元素内容而不使用任何web浏览器控件 使用这段代码,我将元素呈现到表单的画布上(仅作为示例)。 虽然它可以工作,但是这段代码不是一个好的实践-请参见下文,为什么 uses SHDocVw, MSHTML; procedure TForm1.Button1Click(Sender: TObject); var WebBrowser: TWebBrowser; HTMLElement: IHTMLElement; HTMLRenderer

有没有一种方法可以在画布上绘制特定的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;
使用
SHDocVw,MSHTML;
程序TForm1.按钮1单击(发送方:TObject);
变量
网络浏览器:TWebBrowser;
HTMLElement:IHTMLElement;
HTMLender:IHTMLELELEMENTRENDER;
开始
WebBrowser:=TWebBrowser.Create(无);
尝试
WebBrowser.ParentWindow:=应用程序.句柄;
WebBrowser.Navigate('https://stackoverflow.com/questions/2975586/good-delphi-blogs');
当WebBrowser.ReadyState
这很糟糕,因为

  • 它使用隐藏控件,但我希望通过接口直接加载HTML文档,并在自己的画布上呈现某些元素
  • 如果我手动创建并加载渲染器,例如,渲染器方法不会绘制任何内容(可能是因为没有用于渲染文档的画布)
  • 更糟糕的是,现在已经不推荐使用这种方法,所以我正在寻找一种在自己的画布上呈现元素的替代方法

有没有一种干净的方法可以用MSHTML解决这个问题?

也许你可以试试THtmlViewer?

请参见tms软件中的DrawToDC,两者都要求TWebBrowser控件将文档实际呈现到目标DC中。

您是否尝试嵌入chromium:,有一个屏幕外呈现组件。同意,请尝试DelphiChromiumBedded。它甚至包括一个屏幕外渲染演示。感谢您的回复,但我想避免使用任何第三方控件(即使它们可能更好)。我想使用纯MS接口解决方案。很遗憾,
IHTMLElement
不支持
IViewObject
。什么是“严重隐藏”呢?为什么不直接使用TWebBrowser?如果chromium支持在画布上绘图,为什么不呢?@Marcus,我的意思是它将
ParentWindow
设置为
应用程序。Handle
,在我看来不太好。至于第二个问题,因为我想避免使用TWebBrowser
;我想直接使用
IHTMLDocument
。为什么不是铬?就因为我正在寻找MS HTML解决方案:)我知道它比旧的IWebBrowser2包装器更好;)一瞬间被狙击!这些确实有效,但可能会在大多数现代ajax-y页面上窒息。谢谢,但我真的在寻找MS的替代方案(如果有)。我感谢你的回答,但不幸的是
THTMLabel
没有源代码和付费,我打赌它有自己的解析和渲染系统。我真的很关注MS界面。正如我承诺的,包括+1:)无论如何,有趣的音乐制作,我听过你的一些曲目,我喜欢。这听起来很像depche模式。