天道酬勤,学无止境

CHtmlView Navigate2 和 ExecWB 执行(CHtmlView Navigate2 and ExecWB Execution)

问题

这是链接到我之前的问题。

我设法为我的应用程序生成的报告创建了一个从CHtmlView派生的新视图,用于新类型的视图,但我在新视图中发现了一些问题

class CMyHtmlView : public CHtmlView
{
protected: // create from serialization only
    CMyHtmlView();
    DECLARE_DYNCREATE(CMyHtmlView)

// Attributes
public:
    CReportDoc* GetDocument();

    CString          m_sFileName;

// Operations
public:

// Overrides
    // ClassWizard generated virtual function overrides
    //{{AFX_VIRTUAL(CMyHtmlView)
    public:
    virtual void OnDraw(CDC* pDC);  // overridden to draw this view
    virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
    protected:
    virtual void OnInitialUpdate(); // called first time after construct
    virtual void OnFilePrintPreview();
    virtual void OnFilePrint();
    //}}AFX_VIRTUAL

// Implementation
public:
    virtual ~CMyHtmlView();
    //{{AFX_MSG(CMyHtmlView)
        // NOTE - the ClassWizard will add and remove member functions here.
    //}}AFX_MSG
    DECLARE_MESSAGE_MAP()
};

void CMyHtmlView::OnFilePrintPreview()
{   
    // Before this I will call a Function Generate a HTML File in a Location and Updated in m_sFileName
    Navigate2(m_sFileName);
    ExecWB(OLECMDID_PRINTPREVIEW, OLECMDEXECOPT_PROMPTUSER, NULL, NULL );
}

void CMyHtmlView::OnInitialUpdate()
{
    CHtmlView::OnInitialUpdate();
    Navigate2(_T("about:blank"));
}

void CMyHtmlView::OnFilePrint()
{
    // Before this I will call a Function Generate a HTML File in a Location and Updated in m_sFileName
    Navigate2(m_sFileName,NULL,NULL);
    CHtmlView::OnFilePrint();
}

在此打印OnFilePrint()工作没有任何问题。 但问题存在于OnFilePrintPreview()

这是问题所在:

在调用ExecWB()一后Navigate()使得仅在App HTML视图基于Windows,被证明没有打印预览窗口

我做错了什么吗?

回答1

我找到了一种方法来结束 Navigate() 后打印和打印预览的问题。 正如 user1793036 提到的,这是一个异步调用,我需要等待该操作完成。 这就是打印预览和打印加载空白页面的原因。

我找到了事件 OnNavigateComplete2() 并按如下方式覆盖以实现轻松的打印/预览操作。

void CMyHtmlView::OnNavigateComplete2(LPCTSTR strURL)
{
    if(m_ePrintMode == PREVIEW)
        ExecWB(OLECMDID_PRINTPREVIEW, OLECMDEXECOPT_PROMPTUSER, NULL, NULL );
    else if(m_ePrintMode == PRINT)
        CHtmlView::OnFilePrint();
    else
        return;
}

并将我的打印和打印预览事件修改为

void CMyHtmlView::OnFilePrintPreview()
{
    OnSaveHtmlReport();

    m_ePrintMode = PREVIEW; // an Enum

    Navigate2(m_sFileName);
}

void CMyHtmlView::OnFilePrint()
{
    OnSaveHtmlReport();

    m_ePrintMode = PRINT; // an Enum

    Navigate2(m_sFileName,NULL,NULL);
}

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • CHtmlView Navigate2 and ExecWB Execution
    This is Linking to my previous question. I have managed to make a new view derived from the CHtmlView for the new type of View for the my application generated reports but I find some problem in the new View class CMyHtmlView : public CHtmlView { protected: // create from serialization only CMyHtmlView(); DECLARE_DYNCREATE(CMyHtmlView) // Attributes public: CReportDoc* GetDocument(); CString m_sFileName; // Operations public: // Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CMyHtmlView) public: virtual void OnDraw(CDC* pDC); // overridden to draw this view
  • VBA复制网站数据(VBA to copy website data)
    问题 有人可以帮我指出正确的方向,如何通过VBA将网站上的特定数据复制到Excel工作表吗? 我尝试使用宏记录器和Web查询,但它一直显示错误脚本,并且黄色箭头没有出现在我要复制的部分。 这是我要复制http://etfdb.com/etf/EEM/#holdings的网站 我只想复制“前十大控股公司”部分。 任何帮助将不胜感激。 先感谢您。 编辑:这是我当前的代码,但没有显示任何内容,有人可以告诉我怎么了吗? Sub Get123() Dim oHtml As HTMLDocument Dim oElement As Object Set oHtml = New HTMLDocument With CreateObject("WINHTTP.WinHTTPRequest.5.1") .Open "GET", "http://etfdb.com/etf/EEM/#holdings", False .send oHtml.body.innerHTML = .responseText End With For Each oElement In oHtml.getElementsByClassName("holdings-left-content") ActiveSheet.Range("A1").Value = oElement.Value Next oElement End Sub
  • Is it not possible to add our own menu items on the CHtmlView context menu?
    So I keep coming back to this article on CodeProject: https://www.codeproject.com/Articles/4758/How-to-customize-the-context-menus-of-a-WebBrowser I then realised this statement at the top of the article: The revised sample projects are using a new, much better customization approach that is going to be comprehensively discussed in the next update of this article, which will hopefully be ready in a couple of weeks. I am publishing this semi-documented and not fully-tested code, because I am having indications that some developers may need to have this code much sooner than the day of my next
  • 更新Windows后Browser.ExecScript()停止工作(Browser.ExecScript() stopped working after updating windows)
    问题 我已经为WatiN(版本2.1)设置了一个简单的测试平台,其内容为: var browser = new IE(); browser.GoTo("http://www.google.co.il"); // webpage doesn't matter really browser.RunScript("alert(123)"); 仅在未安装KB3025390的情况下才有效。 安装它会破坏UntestorizedAccessException的上述测试,该异常的HRESULT设置为E_ACCESSDENIED。 是什么赋予了? 有什么解决方法吗? 更新:将IWebBrowser2.Navigate2与“ javascript:console.log(123)”类型的脚本一起使用是可行的 使用这样的反向渠道让我感到不安通过此反向通道运行的脚本。Navigate2()的最大长度只能为大约2070个字符(给定或获取),否则它们将被强行截断为该长度,从而在尝试运行它们时导致javascript错误即使在使用最简单的脚本的情况下,使用.Navigate2()也可能会阻塞Internet Explorer的就绪状态,因为它将被设置为READYSTATE_LOADING,而没有希望摆脱它的希望。 简单来说,这意味着一旦您使用了这种技巧,您要么必须以“不要等待网页加载”的方式
  • 在IE中:org.openqa.selenium.WebDriverException:这通常意味着对COM方法IWebBrowser2 :: Navigate2()的调用失败(In IE: org.openqa.selenium.WebDriverException: This usually means that a call to the COM method IWebBrowser2::Navigate2() failed)
    问题 我正在使用Selenium为我的Web应用程序编写测试用例。 当我从Firefox运行测试时,它工作正常,但是当我尝试从IE运行测试时,我无法运行,并且收到错误消息: 这通常意味着对COM方法IWebBrowser2 :: Navigate2()的调用失败异常。 System.setProperty("webdriver.ie.driver", "browserdrivers/IEDriverServer.exe"); WebDriver web = new InternetExplorerDriver(); web.get("URL"); 我能够看到IE屏幕,但它没有导航到该URL,并且我遇到了异常。 我该如何解决? 回答1 您必须在Internet Explorer中将每个区域的保护模式设置设为相同的值。 希望以下链接对您有所帮助。 在Selenium WebDriver中实现InternetExplorerDriver的过程中发生NoSuchElementException 问候, 维格涅什 回答2 我自己刚刚遇到了这个问题。 对我来说,问题在于我的应用程序使用HTTP基本身份验证,并且我试图通过页面URL设置用户名/密码组合,例如:http:// username:password @ host / path 问题是默认情况下IE不允许您以这种方式设置用户名和密码
  • IE Com Object, Difference between methods .Navigate and .Navigate2
    What is the difference between $ie.Navigate("URL") and $ie.Navigate2("URL")? Get-Member says: Navigate Method void Navigate (string, Variant, Variant, Variant, Variant) Navigate2 Method void Navigate2 (Variant, Variant, Variant, Variant, Variant) Sample Code: $ie = New-Object -ComObject InternetExplorer.Application $ie.visible = $true $ie.Navigate("www.stackoverflow.com") #or $ie.Navigate2("www.stackoverflow.com")
  • IE11 Selenium WebDriverException: Failed to navigate. (org.openqa.selenium.WebDriverException …IWebBrowser2::Navigate2() failed
    I am new to automated testing and, though my Selenium tests are running on Chrome and Firefox, they are not running on IE11. I did all the checks I detail below, but I keep on bumping into this error: org.openqa.selenium.WebDriverException: Failed to navigate to http://myapp. This usually means that a call to the COM method IWebBrowser2::Navigate2() failed. I did first the required configuration as in https://code.google.com/p/selenium/wiki/InternetExplorerDriver#Required_Configuration) . I have tried editing my registry as suggested at In IE: org.openqa.selenium.WebDriverException: This
  • Browser.ExecScript() stopped working after updating windows
    I've set up a simple testbed for WatiN (ver 2.1) which reads: var browser = new IE(); browser.GoTo("http://www.google.co.il"); // webpage doesn't matter really browser.RunScript("alert(123)"); This works only if KB3025390 is not installed. Installing it breaks the above test with an UnAuthorizedAccessException which has HRESULT set to E_ACCESSDENIED. What gives? Is there any workaround? Update: Using IWebBrowser2.Navigate2 along with "javascript:console.log(123)" type of scripts works however it makes me feel uneasy using such a backchannel the scripts run through this back-channel of
  • IE.navigate2 fails with protected mode off
    I'm automating IE8 from Excel VBA (Excel 2010, Windows 7) Set IE = CreateObject("InternetExplorer.Application") IE.Navigate2 URL If URL is a website in a zone where IE protected mode is on, everything is fine. If URL is a website in a zone where IE protected mode is off, the script fails (IE becomes automatically visible, IE object is lost in VBA - automation error). Is there any way to enable navigate2 in zones with protected mode off?
  • WebBrowser控件使用详解
    方法 说明  GoBack 相当于IE的“后退”按钮,使你在当前历史列表中后退一项  GoForward 相当于IE的“前进”按钮,使你在当前历史列表中前进一项  GoHome 相当于IE的“主页”按钮,连接用户默认的主页  GoSearch 相当于IE的“搜索”按钮,连接用户默认的搜索页面  Navigate 连接到指定的URL  Refresh 刷新当前页面  Refresh2 同上,只是可以指定刷新级别,所指定的刷新级别的值来自RefreshConstants枚举表, 该表定义在ExDisp.h中,可以指定的不同值如下: REFRESH_NORMAL 执行简单的刷新,不将HTTP pragma: no-cache头发送给服务器 REFRESH_IFEXPIRED 只有在网页过期后才进行简单的刷新 REFRESH_CONTINUE 仅作内部使用。在MSDN里写着DO NOT USE! 请勿使用 REFRESH_COMPLETELY 将包含pragma: no-cache头的请求发送到服务器  Stop 相当于IE的“停止”按钮,停止当前页面及其内容的载入 属性 说明  Application 如果该对象有效,则返回掌管WebBrowser控件的应用程序实现的自动化对象(IDispatch)。如果在宿主对象中自动化对象无效,这个程序将返回WebBrowser 控件的自动化对象
  • 如何从批处理文件启动多个Internet Explorer窗口/选项卡?(How to launch multiple Internet Explorer windows/tabs from batch file?)
    问题 我想要一个批处理文件来启动两个单独的程序,然后关闭命令行窗口。 实际上,为澄清起见,我正在使用两个不同的URL启动Internet Explorer。 到目前为止,我有这样的事情: start "~\iexplore.exe" "url1" start "~\iexplore.exe" "url2" 我得到的是一个Internet Explorer实例,仅加载了第二个URL。 似乎第二个正在替换第二个。 我似乎记得一种语法,在该语法中,我将加载新的命令行窗口并传递命令以在加载时执行,但找不到引用。 问题的第二部分:在编写快速批处理文件时需要保留的良好参考URL是什么? 编辑:我已经标记了一个答案,因为它确实有效。 我现在有两个窗口,每个URL一个。 (谢谢!)有趣的是,如果没有使用/ d方法的原始语法,我会根据是否打开了预先存在的Internet Explorer实例而得到不同的结果。 如果可以,我为我的两个URL添加了两个新标签(甜!) 如果没有,我只能获得传递给我的第二个URL的最后一个选项卡。 回答1 在您的批处理文件中尝试以下操作: @echo off start /d "C:\Program Files\Internet Explorer" IEXPLORE.EXE www.google.com start /d "C:\Program Files\Internet
  • In IE: org.openqa.selenium.WebDriverException: This usually means that a call to the COM method IWebBrowser2::Navigate2() failed
    I am using Selenium to write test cases for my web application. When I run the test from Firefox it's working fine, but when I try to run it from IE I am not able to run and I get the error message: This usually means that a call to the COM method IWebBrowser2::Navigate2() failed exception. System.setProperty("webdriver.ie.driver", "browserdrivers/IEDriverServer.exe"); WebDriver web = new InternetExplorerDriver(); web.get("URL"); I am able to see IE screen but it's not navigating to that URL, and I am getting above exception. How can I resolve this ?
  • 使用VBA访问iframe中的对象(Accessing object in iframe using VBA)
    问题 要点: 我已成功使用VBA执行以下操作: 使用getElementsByName登录到网站选择将要生成的报告的参数(使用getelementsby ...) 选择参数后生成报告,以将结果数据集渲染到同一页面上的iframe中 重要注意事项-网站位于客户端 上面是简单的部分,困难的部分如下: 单击iframe中的gif图像,该图像将数据集导出到csv 我尝试了以下方法: Dim idoc As HTMLDocument Dim iframe As HTMLFrameElement Dim iframe2 As HTMLDocument Set idoc = objIE.document Set iframe = idoc.all("iframename") Set iframe2 = iframe.contentDocument Do Until InStr(1, objIE.document.all("iframename").contentDocument.innerHTML, "img.gif", vbTextCompare) = 0 DoEvents Loop 为上述逻辑提供一些背景信息- 我进入了主机我通过其name元素访问了iframe 我访问了iframe中的内容我试图找到需要单击以导出到csv的gif图像 正是在这行上说“对象不支持此属性或方法”
  • 创建后访问IE选项卡(Accessing IE tabs once created)
    问题 使用VBA,我可以使用以下方法创建具有3个不同选项卡的InternetExplorer对象 Option Explicit Public Enum IE_READYSTATE Uninitialised = 0 Loading = 1 Loaded = 2 Interactive = 3 complete = 4 End Enum Sub Example_Click() Dim ieApp As clsIE 'Create IE and login If ieApp Is Nothing Then Set ieApp = New clsIE With ieApp 'IE Tab1 .IE.Visible = True .IE.navigate "http://www.bbc.co.uk/news/" Do While .IE.Busy Or Not .IE.readyState = IE_READYSTATE.complete: DoEvents: Loop 'IE Tab2 .IE.Navigate2 "http://www.bbc.co.uk", CLng(2048) Do While .IE.Busy Or Not .IE.readyState = IE_READYSTATE.complete: DoEvents: Loop 'IE Tab3 .IE.Navigate2
  • 带有标签的HTML文本,用于在Excel单元格中格式化文本(HTML Text with tags to formatted text in an Excel cell)
    问题 有没有办法采用HTML并将其导入到excel中,以便将其格式化为富文本格式(最好使用VBA)? 基本上,当我粘贴到Excel单元格时,我希望将其更改为: <html><p>This is a test. Will this text be <b>bold</b> or <i>italic</i></p></html> 到这个: 这是一个测试。 该文字是粗体还是 回答1 是的,这是可能的:)实际上,让Internet Explorer为您完成肮脏的工作;) 经过测试 我的假设 我假设html文本在Sheet1的单元格A1中。 您也可以改用变量。 如果您的列中充满了html值,则只需将以下代码放入循环中 代码(请参阅末尾的注释) Sub Sample() Dim Ie As Object Set Ie = CreateObject("InternetExplorer.Application") With Ie .Visible = False .Navigate "about:blank" .document.body.InnerHTML = Sheets("Sheet1").Range("A1").Value .document.body.createtextrange.execCommand "Copy" ActiveSheet.Paste Destination
  • 从Windows服务中打印HTML文档而无需打印对话框(Print html document from Windows Service without print dialog)
    问题 我正在使用Windows服务,我想在服务启动时打印.html页面。 我正在使用此代码,并且打印效果很好。 但是会出现一个打印对话框,如何在没有打印对话框的情况下进行打印? public void printdoc(string document) { Process printjob = new Process(); printjob.StartInfo.FileName = document; printjob.StartInfo.UseShellExecute = true; printjob.StartInfo.Verb = "print"; printjob.StartInfo.CreateNoWindow = true; printjob.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; printjob.Start(); } 还有其他方法可以打印此图像而不显示“打印”对话框。 更新:针对此: 但是我已经使用过此类,但是当我打电话给 axW.ExecWB(SHDocVw.OLECMDID.OLECMDID_PRINT,SHDocVw.OLECMDEXECOPT.OLECMDEXECOPT_PROMPTUSER , ref em, ref em); 当我从Windows服务使用时,我的程序在这里阻塞
  • How to detect Print command has finished in TWebBrowser?
    procedure TForm1.Button1Click(Sender: TObject); var vaIn, vaOut: OleVariant; begin WebBrowser1.Navigate('http://www.google.com'); while WebBrowser1.ReadyState < READYSTATE_COMPLETE do Application.ProcessMessages; WebBrowser1.ExecWB(OLECMDID_PRINT, OLECMDEXECOPT_PROMPTUSER, vaIn, vaOut); // HOWTO: WAIT until print <strike>job</strike> dialog is done or canceled // UPDATE (1): WebBrowser1.Enabled := False; WebBrowser1.OnCommandStateChange := WebBrowser1CommandStateChange; end; procedure TForm1.WebBrowser1CommandStateChange(Sender: TObject; Command: Integer; Enable: WordBool); begin Memo1.Lines
  • Microsoft Internet Controls
    I am using: IE.ExecWB 17, 0 '// SelectAll IE.ExecWB 12, 2 '// Copy selection in an Excel VBA program successfully, but I am having trouble finding a reference for all ExecWB methods. Can anyone point me in the right direction?
  • 如何将WebBrowser控件放入IE9的标准中?(How to put the WebBrowser control into IE9 into standards?)
    问题 我正在使用自动化(即COM自动化)在Internet Explorer(9)中显示一些HTML: ie = CoInternetExplorer.Create; ie.Navigate2("about:blank"); webDocument = ie.Document; webDocument.Write(szSourceHTML); webDocument.Close(); ie.Visible = True; 出现Internet Explorer,显示我的html,其开头为: <!DOCTYPE html> <HTML> <HEAD> ... 注意: html5 standard-mode opt-in doctype html 除了文件不是ie9标准模式外; 它处于ie8标准模式: 如果我先将html保存到我的计算机中: 然后查看该html文档,IE进入标准模式: 我的问题是如何更新SpawnIEWithSource(String html)函数以使浏览器进入标准模式? void SpawnIEWithSource(String html) { Variant ie = CoInternetExplorer.Create(); ie.Navigate2("about:blank"); webDocument = ie.Document; webDocument
  • How to put the WebBrowser control into IE9 into standards?
    i am using automation (i.e. COM automation) to display some HTML in Internet Explorer (9): ie = CoInternetExplorer.Create; ie.Navigate2("about:blank"); webDocument = ie.Document; webDocument.Write(szSourceHTML); webDocument.Close(); ie.Visible = True; Internet Explorer appears, showing my html, which starts off as: <!DOCTYPE html> <HTML> <HEAD> ... Note: the html5 standards-mode opt-in doctype html Except that the document is not in ie9 standards mode; it's in ie8 standards mode: If i save the html to my computer first: and then view that html document, IE is put into standards mode: My