CppWebBrowser 怎么样判断网页已经完全打开?

电脑爆 2006-07-14 07:47:42
我使用的是CppWebBrowser控件的DocumentComplete事件,不过这个事件有点问题:

假如我打开网易的首页:http://www.163.com

WideString url="http://www.163.com";
CppWebBrowser1->Navigate(url);

其DocumentComplete事件处理如下:

int i=1;//定义一个全局变量
void __fastcall TForm3::CppWebBrowser1DocumentComplete(TObject *Sender,
LPDISPATCH pDisp, Variant *URL)
{
ShowMessage("这个事件产生了"+(AnsiString)i+"次");
i++;
}

从产生的消息上可以看出这个事件在打开网页首页的过程中产生了N次(N>1);

但我现在只想要他产生一次,也就是得到i=1的效果,
请高手指教.
...全文
858 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
yhec 2006-10-29
  • 打赏
  • 举报
回复
hz
meCAD 2006-08-05
  • 打赏
  • 举报
回复
做个记号
电脑爆 2006-07-18
  • 打赏
  • 举报
回复
严重感谢蒋晟大侠的帮助!
问题解决!

^_^
jaffy 2006-07-18
  • 打赏
  • 举报
回复
浏览器调用事件

浏览器控件调用许多不同事件来将信息传给用户的应用程序和浏览过程。浏览器控件将导向一个新的

地址时,它调用BeforeNavigate事件来指明新地址的URL或路径,和任何将通过HTTP环境下传递给

Internet服务器的数据。那些数据可以包括HTTP域名、HTTP数据和与之相关的URL。BeforeNavigate事

件同时包含一个取消的标志,你可以将它设定为False来取消导向过程。当浏览器控件完成对新地址的

导向后,它就调用NavigateComplete事件。这个事件包括除了取消标志以外BeforeNavigate事件的全

部信息。

每当浏览器控件开始下载操作时,它就调用DownloadBegin事件。而下载过程中它多次调用

ProgressChange事件,下载完成后它则调用DownloadComplete事件。应用程序通常用这三个事件来指

明下载操作的进度,而且会用一个进程条来显示进度。应用程序用显示、更新和关闭进程条分别作出

对DownloadBegin 、ProgressChange和DownloadComplete三种事件的响应。当应用程序用

navOpenInNewWindow标志来调用导航方式时,浏览器控件会在导向新地址前调用NewWindow事件。这事

件包含了新地址的信息和决定应用程序还是浏览器控件来创建新窗口的标志。把该标志设为True则由

应用程序来创建窗口,设为False则由浏览器控件来创建。
以上是MSDN说的,但是我发现好象调用DocumentComplete才是对的
难道文档写错了
蒋晟 2006-07-17
  • 打赏
  • 举报
回复
void __fastcall TSketchPadForm1::CppWebBrowser1DocumentComplete(
TObject *Sender, LPDISPATCH pDisp, TVariant *URL)
{

// get a pointer to a IWebBrowser2 interface

IWebBrowser2* m_pBrowser
m_pBrowser = CppWebBrowser1->ControlInterface;

HRESULT hr;
IUnknown* pUnkBrowser = NULL;
IUnknown* pUnkDisp = NULL;
IStream* pStream = NULL;
HGLOBAL hHTMLText;
static char szHTMLText[]="<html><h1>HELLO</h1>";

// MODIFICATIONS *******

AnsiString strHTML;

int szHTML;
strHTML = Memo1->Text;

szHTML= strHTML.Length();

// Is this the DocumentComplete event for the top frame window?
// Check COM identity: compare IUnknown interface pointers.
hr = m_pBrowser->QueryInterface( IID_IUnknown, (void**)&pUnkBrowser );
if ( SUCCEEDED(hr) )
{
hr = pDisp->QueryInterface( IID_IUnknown, (void**)&pUnkDisp );
if ( SUCCEEDED(hr) )
{
if ( pUnkBrowser == pUnkDisp )
{ // This is the DocumentComplete event for the top
frame - page is loaded!
// Create a stream containing the HTML.
// Alternatively, this stream may have been passed to
us.
// hHTMLText = GlobalAlloc( GPTR,
lstrlen(szHTMLText)+1 );

// MODIFICATION
// *****************************************
hHTMLText = GlobalAlloc( GPTR, szHTML+1 );

if ( hHTMLText )
{
// lstrcpy( (char*)hHTMLText, szHTMLText );

// MODIFICATION ***********************

lstrcpy( (char*)hHTMLText, strHTML.c_str() );

hr = CreateStreamOnHGlobal( hHTMLText, TRUE, &pStream );
if ( SUCCEEDED(hr) )
{
// Call the helper function to load the WebOC
from the stream.
LoadWebOCFromStream( m_pBrowser, pStream );
pStream->Release();
}
GlobalFree( hHTMLText );
}
}
pUnkDisp->Release();
}
pUnkBrowser->Release();
}


电脑爆 2006-07-17
  • 打赏
  • 举报
回复
自已再顶上来一下
电脑爆 2006-07-16
  • 打赏
  • 举报
回复
那请问jiangsheng(蒋晟.Net[MVP])大侠
这里应该怎么写才对呢?
蒋晟 2006-07-16
  • 打赏
  • 举报
回复
错了
应该用CppWebBrowser1的IUnknown接口来比较
电脑爆 2006-07-15
  • 打赏
  • 举报
回复
看了jiangsheng(蒋晟)大侠的一篇文章,中间有说到这个问题
不过我改写后还有问题,下面程序始终执行不到ShowMessage("网页加载完成");这一行.

请高手指教.

void __fastcall TForm1::CppWebBrowser1DocumentComplete(TObject *Sender,
LPDISPATCH pDisp, Variant *URL)
{
HRESULT hr;
IUnknown* pUnkBrowser = NULL;
IUnknown* pUnkDisp = NULL;
// 这个 DocumentComplete 事件是否是顶层框架窗口的?
// 检查 COM 标识: 比较IUnknown 接口指针.
LPDISPATCH WebDoc;
WebDoc=CppWebBrowser1->Document;
hr = WebDoc->QueryInterface(IID_IUnknown,(void**)&pUnkBrowser);
if ( SUCCEEDED(hr) )
{
hr = pDisp->QueryInterface( IID_IUnknown, (void**)&pUnkDisp );
if ( SUCCEEDED(hr) )
{
if ( pUnkBrowser == pUnkDisp )
{ // 这是顶层框架窗口的DocumentComplete 事件 —— 页面 载入完成!
ShowMessage("网页加载完成");
}
pUnkDisp->Release();
}
pUnkBrowser->Release();
}
}
jammyxu 2006-07-14
  • 打赏
  • 举报
回复
猜測是因為網頁為Frame架構﹐開一個網頁時﹐load了多個html文件。
电脑爆 2006-07-14
  • 打赏
  • 举报
回复
改正一下:
全局变量i的初始值为0;

int i=0;//定义一个全局变量
void __fastcall TForm3::CppWebBrowser1DocumentComplete(TObject *Sender,
LPDISPATCH pDisp, Variant *URL)
{
i++;
ShowMessage("这个事件产生了"+(AnsiString)i+"次");
}

1,317

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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