|
|
CHtmlView \ WebBrowser2 如何真正知道DocumentComplete
& Q5 Y5 G& E* P" k& R+ }% l
* D# h# R$ W. E; z9 R' ` (下文针对CHtmlView,由于WebBrowser2与其类似不再累赘。)8 V$ E' s) f$ c2 x1 F% f
虽然CHtmlView提供了下面虚函数来得到文档解析完毕的事件。
' E0 Z6 ?3 d4 L" d3 u+ ]; U) ]1 G8 X. B: ]
virtual void OnDocumentComplete(
1 O2 r) h+ c) y LPCTSTR lpszURL
" Y# V& R! s$ H! y0 y; a);
4 ^: D1 h* G6 y但这个事件在网页存在 frame 的时候不再那么有效了,因为一旦某个frame激发了OnDownloadBegin,那么就会激发OnDocumentComplete,结果你会发现你的一个网页激发了多个OnDocumentComplete,而你也不知道哪个OnDocumentComplete真正能告诉你网页处理完毕了。
( x& X) H# |7 z* h3 p F0 I
$ i) j) j6 O; G+ B
8 |- a* p+ N" z& c! k4 u9 n" a3 ^ n. V" @( s
解决办法有三个:
4 V2 w% H' Z, M( \6 w5 w5 }& z1 g- k
方法一: 通过CHtmlView::OnProgressChange获取结束事件。 不理会OnDocumentComplete,
3 e) j7 m! b2 G0 [9 W& k7 e" d9 r. W. ?! @1 l% C, R+ `
在OnProgressChange中有两个参数:% X% m+ y% q: {1 P C( x
virtual void OnProgressChange(
1 n. d" X! I' y& {) @9 B: v1 \+ C long nProgress," m( W. }, [' r* h8 F& d* e& f
long nProgressMax
6 o @9 P) T+ |) J! p, C- b% j);3 j7 R+ b8 C( T& q3 T
当第一个参数nProgress为-1时表示网页处理完毕。: p! t& ^: g+ l
* i5 \/ Y( U% |) K: W! h& v, c7 q 另外两种方法可以在微软的知识库获得:
0 u! h. w) O" L" f4 q4 } http://support.microsoft.com/support/kb/articles/q180/3/66.asp
2 i3 ^6 _1 X' H x- \ w( J HOWTO: Determine When a Page Is Done Loading in WebBrowser Control
1 d# E( \2 \+ Y Q180366
, ^9 k; @4 |! I6 ~ 6 f3 d U! q' x3 C4 p
对于其中的方法一有一点补充,在上文support的代码中其在通过调用GetControlUnknown()获得WebBrowser控件的IUnknown指针后调用Release将接口释放了。. j2 C: P) j: G# M7 r
这是千万不行的!这将导致你的WebBrowser控件无法清除,详细可以参见MSDN对CWnd::GetControlUnknown的介绍。 |
|