|
CHtmlView \ WebBrowser2 如何真正知道DocumentComplete
' v5 T+ w7 I' |7 ~* ^3 g; z+ j* e
(下文针对CHtmlView,由于WebBrowser2与其类似不再累赘。)
% x+ K* Z/ O0 y2 s( a虽然CHtmlView提供了下面虚函数来得到文档解析完毕的事件。+ q2 R! h( b3 I; D2 }2 p% a S8 g
0 E2 m0 V2 g% p9 f: T4 V6 |1 [
virtual void OnDocumentComplete( \8 \2 t9 B9 Q
LPCTSTR lpszURL ) y, c1 f: a6 Z: `, C4 g z: X: A
);
( V3 W- z' n) r: T' k9 m: E但这个事件在网页存在 frame 的时候不再那么有效了,因为一旦某个frame激发了OnDownloadBegin,那么就会激发OnDocumentComplete,结果你会发现你的一个网页激发了多个OnDocumentComplete,而你也不知道哪个OnDocumentComplete真正能告诉你网页处理完毕了。
: P' E# ^: ?: j* ?% H
; D4 O: R, v; l$ h* L" ~+ c 5 B# ]7 [* E9 c
* I" d. d" L# f( s! j解决办法有三个:
; F5 `* F6 \" P+ z3 {, n) b9 _( a$ l( f* |% X
方法一: 通过CHtmlView::OnProgressChange获取结束事件。 不理会OnDocumentComplete," V4 \/ y2 w- f
9 \; P; V: l# f p. o: v% i
在OnProgressChange中有两个参数:
( B: k* ~: A' P# I) u3 _virtual void OnProgressChange(
* P& D5 G7 X0 E b long nProgress,1 G; G8 P# Y) o4 c
long nProgressMax
3 L9 R2 d' o* s);
1 C5 {! u4 m7 Y: {! o* U) m2 ]: w2 l7 A 当第一个参数nProgress为-1时表示网页处理完毕。
- i: Z' G. B7 b0 q+ O% ]7 t( C" w1 D' E3 ?6 G7 e5 S, z
另外两种方法可以在微软的知识库获得:
4 v4 R1 Q7 [$ w5 v( f0 {) G http://support.microsoft.com/support/kb/articles/q180/3/66.asp
& t# w( N2 M3 Q/ A HOWTO: Determine When a Page Is Done Loading in WebBrowser Control; @9 D7 w" P: f9 S* c% F( F4 f' F
Q180366
2 J/ r5 M+ X% _) L
) b; Q" q3 K9 n& Y) x 对于其中的方法一有一点补充,在上文support的代码中其在通过调用GetControlUnknown()获得WebBrowser控件的IUnknown指针后调用Release将接口释放了。
& S4 G' u! H+ W' e& M 这是千万不行的!这将导致你的WebBrowser控件无法清除,详细可以参见MSDN对CWnd::GetControlUnknown的介绍。 |
|