CWebBrowser2::ExecWB为何打印报错?
本帖最后由 xjkstar 于 2013-03-14 17:41:32 编辑 小弟今天刚学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 };
CWebBrowser2m_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,这是为什么???
MFC CWebBrowser2 网页
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;
}
[解决办法]
我是这么想的,Navigate应该是一个异步函数,在Navigate执行完毕以后,网页还没有完全加载,会不会跟这个有关系。
[解决办法]
那是因为还没加载完,你应该在DocumentComplete中判断是否已经加载完,加载完了再打印,还有就是不要在主窗口线程中调用sleep,这样是没用的,但是你可以用定时器,到一定时间再打印