|
CHtmlView \ WebBrowser2 如何真正知道DocumentComplete; ?0 W, y9 o: P) Q) z, A
! q" Y* X! s' ?- d. w3 } (下文针对CHtmlView,由于WebBrowser2与其类似不再累赘。)
' V' ]/ n1 {( ]4 A# K# \虽然CHtmlView提供了下面虚函数来得到文档解析完毕的事件。
/ H2 b3 _5 ~2 Z9 P" s9 x3 D5 c' O" c( b" O, A3 d7 ]* I% A" H7 e
virtual void OnDocumentComplete($ ^' h5 o4 l& u0 G
LPCTSTR lpszURL 1 ?# z, D$ z5 U' r
);
3 P4 ?% k* Y1 ^- \+ y6 P但这个事件在网页存在 frame 的时候不再那么有效了,因为一旦某个frame激发了OnDownloadBegin,那么就会激发OnDocumentComplete,结果你会发现你的一个网页激发了多个OnDocumentComplete,而你也不知道哪个OnDocumentComplete真正能告诉你网页处理完毕了。3 s. c1 _' @+ O$ ^1 U
' D% z% x# b0 `; j9 ?
( u/ A4 ]& ^% K& ]5 S" X
. p; f0 X& h; L. @) ~解决办法有三个:* j! x4 @5 n5 d2 h, O
* u$ h4 q) E+ N# D, w( X$ A# m 方法一: 通过CHtmlView::OnProgressChange获取结束事件。 不理会OnDocumentComplete,% K8 }0 G( ?* e- F7 }
+ t z: o6 x0 M0 v/ n; [在OnProgressChange中有两个参数:
F# ]/ M; I1 I1 X: E& s2 E$ D! Xvirtual void OnProgressChange(
3 `* H! t: G% Q! h4 O long nProgress,9 m- f$ U. H; Q0 Y% s* ?
long nProgressMax 6 X; t. @+ {' m4 ]6 U6 a$ q7 l
);2 u5 U# p% [5 n* t6 g
当第一个参数nProgress为-1时表示网页处理完毕。) m% Z5 s$ x, P; D% w
: q' ]* J' z0 |1 {
另外两种方法可以在微软的知识库获得:% ^) e. _3 k! Y" c9 ^
http://support.microsoft.com/support/kb/articles/q180/3/66.asp0 C+ M) ], `( {0 q. a
HOWTO: Determine When a Page Is Done Loading in WebBrowser Control1 V1 _4 @0 w& n- C
Q180366
?+ y/ d3 R; v3 I% c 7 {, ]) _0 P A, k5 {3 D8 O( a
对于其中的方法一有一点补充,在上文support的代码中其在通过调用GetControlUnknown()获得WebBrowser控件的IUnknown指针后调用Release将接口释放了。7 R9 }; \# d4 q5 Q3 r; ?+ m o& l
这是千万不行的!这将导致你的WebBrowser控件无法清除,详细可以参见MSDN对CWnd::GetControlUnknown的介绍。 |
|