|
|
CHtmlView \ WebBrowser2 如何真正知道DocumentComplete
6 Y/ s* L0 q% U2 d; k9 r! h/ d3 h( }: h3 l5 W O1 y: N6 g
(下文针对CHtmlView,由于WebBrowser2与其类似不再累赘。)% z% _% o' Z9 V0 q5 z
虽然CHtmlView提供了下面虚函数来得到文档解析完毕的事件。9 u! K3 P( Q I' {' \
& L! a0 v: k5 ^$ s# ?, Wvirtual void OnDocumentComplete(
) S+ C0 I- J$ S: l LPCTSTR lpszURL
; |7 k7 s+ n) Q- O6 o);: m4 A& { G* n" F! M
但这个事件在网页存在 frame 的时候不再那么有效了,因为一旦某个frame激发了OnDownloadBegin,那么就会激发OnDocumentComplete,结果你会发现你的一个网页激发了多个OnDocumentComplete,而你也不知道哪个OnDocumentComplete真正能告诉你网页处理完毕了。
5 P& o0 C9 D% t/ R0 w$ s4 j$ V$ H$ O) L E j0 B8 Z; C0 y: G$ V; X! t1 k
# h# J1 J7 ]0 P" ]
1 H1 H, c. @# `1 Y' k$ l, R解决办法有三个:
3 y1 c/ c3 K1 ~. Z/ H+ i
% T$ E h! u" J; ]1 v6 o9 P 方法一: 通过CHtmlView::OnProgressChange获取结束事件。 不理会OnDocumentComplete,# U# t& a6 ^7 Q$ ^4 o
) } v! M$ w& C/ H, T8 L- Q
在OnProgressChange中有两个参数:
* z* k2 x7 }8 H- C& Zvirtual void OnProgressChange(
8 t9 c, q' V8 T: `6 X0 N# [ long nProgress,4 J! J/ T+ Z& x1 e7 x" Z
long nProgressMax ' q2 |7 C4 `$ _$ Y$ I: o
);; n1 N6 E9 K/ d/ y9 ~+ i$ a) m" X
当第一个参数nProgress为-1时表示网页处理完毕。
/ P' Q# p7 T6 H8 R6 a! v
8 E. d6 F/ f$ t" d; P$ s1 [ k 另外两种方法可以在微软的知识库获得:
0 F& V" U" `: o; A. y1 ^ http://support.microsoft.com/support/kb/articles/q180/3/66.asp
- t& ]8 N" w8 z1 K( d- y1 h HOWTO: Determine When a Page Is Done Loading in WebBrowser Control
6 v5 l9 J# _6 H& | Q180366
$ t, U2 Z; {" D/ s. O- T7 `
3 u; g _7 ]1 R6 I! {& d- ? 对于其中的方法一有一点补充,在上文support的代码中其在通过调用GetControlUnknown()获得WebBrowser控件的IUnknown指针后调用Release将接口释放了。
% |% \1 Z! L" ]- @- \# I4 E 这是千万不行的!这将导致你的WebBrowser控件无法清除,详细可以参见MSDN对CWnd::GetControlUnknown的介绍。 |
|