CWebBrowser2::ExecWB为何打印报错?

13妖 2013-03-14 04:28:06
小弟今天刚学CWebBrowser2,目的是打印指定路径的网页。遇到了奇怪的问题。
当我把Navigate函数和ExecWB函数放在一起,程序运行报错,弹出一个没有内容的消息框。
当我把ExecWB函数放在另外的按钮上(例如"打印按钮"),程序执行正常。

个人感觉两个函数不能同时调用,求各位大大指点。


class CDlgWebPrint : public CDialog
{
// Construction
public:
//…………
CDlgWebPrint(CWnd* pParent = NULL); // standard constructor
// Dialog Data
//{{AFX_DATA(CDlgWebPrint)
enum { IDD = IDD_DIALOG_WEBPRINT };
CWebBrowser2 m_pWebPrint;
//}}AFX_DATA
}

BOOL CDlgWebPrint::OnInitDialog()
{
CDialog::OnInitDialog();

// TODO: Add extra initialization here


this->m_pWebPrint.Navigate(_T("E:/temp.htm");, NULL, NULL, NULL, NULL);//打开strURL文件

this->m_pWebPrint.ExecWB(OLECMDID_PRINT, OLECMDEXECOPT_DONTPROMPTUSER, NULL, NULL);
//打印

return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}



猜测可能是网页加载状态问题,在网上真的找到了这个函数GetReadyState(),

typedef enum tagREADYSTATE {
READYSTATE_UNINITIALIZED = 0,
READYSTATE_LOADING = 1,
READYSTATE_LOADED = 2,
READYSTATE_INTERACTIVE = 3,
READYSTATE_COMPLETE = 4
} READYSTATE;

READYSTATE_UNINITIALIZED
Default initialization state.
READYSTATE_LOADING
Object is currently loading its properties.
READYSTATE_LOADED
Object has been initialized.
READYSTATE_INTERACTIVE
Object is interactive, but not all of its data is available.
READYSTATE_COMPLETE
Object has received all of its data.


但是还是不行,状态一直停留在Loading,这是为什么???


BOOL CDlgWebPrint::OnPrint()
{
LONG n = 0;
while (TRUE)
{
if (this->m_pWebPrint.GetReadyState() == READYSTATE_COMPLETE )
//READYSTATE_COMPLETE = 4,表示网页加载完成。但这里一直是READYSTATE_LOADING = 1,
//等了十几分钟还是1.我确定打开这个网页不需要1秒钟。还有什么玄机吗?吗吗吗?
{
this->m_pWebPrint.ExecWB(OLECMDID_PRINT, OLECMDEXECOPT_DONTPROMPTUSER, NULL, NULL);
break;
}
else
{
if (n++ > 20)
{
AfxMessageBox(_T("加载网页失败"));
return FALSE;
}

Sleep(500);
}
}

this->ShowWindow(SW_HIDE);

return TRUE;
}
...全文
331 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
13妖 2014-02-13
  • 打赏
  • 举报
回复
问题解决,有需要的朋友参考我的博客《CWebBrowser2加载打印心得》
leaves_wwl 2013-08-12
  • 打赏
  • 举报
回复
我是这样解决的
VARIANT_BOOL isBusy = VARIANT_TRUE;
			while(isBusy==VARIANT_TRUE)
			pWebBrowser2->get_Busy(&isBusy);
13妖 2013-03-18
  • 打赏
  • 举报
回复
引用 4 楼 fishion 的回复:
那是因为还没加载完,你应该在DocumentComplete中判断是否已经加载完,加载完了再打印,还有就是不要在主窗口线程中调用sleep,这样是没用的,但是你可以用定时器,到一定时间再打印
果真是Sleep的问题。用定时器可行。我试用子线程监控来实现。这里我还是用GetReadyState() == READYSTATE_COMPLETE,这样就够了哈。问题解决。谢谢oldmanzhao、fishion。 另外为何有时Navigate时会弹出IE,有时不会?这里的CWebBrowser2是一个对话框控件。我是通过Project插入ActiveX的方式使用CWebBrowser2类。
fishion 2013-03-14
  • 打赏
  • 举报
回复
那是因为还没加载完,你应该在DocumentComplete中判断是否已经加载完,加载完了再打印,还有就是不要在主窗口线程中调用sleep,这样是没用的,但是你可以用定时器,到一定时间再打印
oldmanzhao 2013-03-14
  • 打赏
  • 举报
回复
sleep主线程就沉睡了,当然Navigate也不会执行了。
13妖 2013-03-14
  • 打赏
  • 举报
回复
引用 1 楼 oldmanzhao 的回复:
我是这么想的,Navigate应该是一个异步函数,在Navigate执行完毕以后,网页还没有完全加载,会不会跟这个有关系。
有可能,那怎么办?sleep了很久也没有反应。
oldmanzhao 2013-03-14
  • 打赏
  • 举报
回复
我是这么想的,Navigate应该是一个异步函数,在Navigate执行完毕以后,网页还没有完全加载,会不会跟这个有关系。

3,055

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC HTML/XML
社区管理员
  • HTML/XML社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧