|
|
CHtmlView \ WebBrowser2 如何真正知道DocumentComplete! a* I ?1 @1 \+ g+ g
3 O* z. Y4 T1 g6 k
(下文针对CHtmlView,由于WebBrowser2与其类似不再累赘。)3 N' e' A! t* o b7 b- g) P
虽然CHtmlView提供了下面虚函数来得到文档解析完毕的事件。* j$ c) a5 n- X
% O5 E$ |$ h8 I+ @# cvirtual void OnDocumentComplete(
9 W4 p: c; K1 {7 s' K2 E5 L' G LPCTSTR lpszURL
. [ G/ T& v+ A4 L);9 Z0 W8 A# x \' ]
但这个事件在网页存在 frame 的时候不再那么有效了,因为一旦某个frame激发了OnDownloadBegin,那么就会激发OnDocumentComplete,结果你会发现你的一个网页激发了多个OnDocumentComplete,而你也不知道哪个OnDocumentComplete真正能告诉你网页处理完毕了。
9 ?% ]- S7 d" d. _/ E$ U& @( w5 W# k& _4 G& }1 H! \/ j. d
9 R8 S' |+ j) M' o, Z6 J ?
7 X0 f: X/ A" {% W+ H+ O* [: @/ e解决办法有三个:
* L1 ^5 a+ s' L. D4 p2 L, i* a" [$ J; C/ M: e2 Z
方法一: 通过CHtmlView::OnProgressChange获取结束事件。 不理会OnDocumentComplete,7 l* ^' k* Y$ w/ B0 D* @% i; @) ^
- p$ N; u- L' s3 {* S* e0 F
在OnProgressChange中有两个参数:" d! |7 g. g# N8 G1 |5 H
virtual void OnProgressChange(
3 \6 \: C9 z2 j: k+ O long nProgress, J4 ]$ x5 \, _6 j: N
long nProgressMax . [! [1 _/ z4 Q. K
);; \& k- I0 b8 A) g9 s
当第一个参数nProgress为-1时表示网页处理完毕。$ `. ?9 B) D2 L' W5 g
/ J' J- D- k& S5 W3 E7 V$ r
另外两种方法可以在微软的知识库获得:
6 h ]1 r H6 {7 W+ c* @9 G# R$ d http://support.microsoft.com/support/kb/articles/q180/3/66.asp
+ R' a0 t* c+ T$ c HOWTO: Determine When a Page Is Done Loading in WebBrowser Control/ B6 ]- p2 @) ]& S, o& k# o
Q180366
. j7 o, ~. y( h8 w, \; r9 `' m6 F ' w9 Z8 T2 S4 O4 I- L7 x: M
对于其中的方法一有一点补充,在上文support的代码中其在通过调用GetControlUnknown()获得WebBrowser控件的IUnknown指针后调用Release将接口释放了。
9 y( o$ w! M4 h 这是千万不行的!这将导致你的WebBrowser控件无法清除,详细可以参见MSDN对CWnd::GetControlUnknown的介绍。 |
|