|
|
CHtmlView \ WebBrowser2 如何真正知道DocumentComplete3 P) y, ?2 _0 e# v4 }4 g# \; R
# i3 H5 y) e9 B1 @1 v! f" k. O' b
(下文针对CHtmlView,由于WebBrowser2与其类似不再累赘。)
3 U8 }* K' i5 b4 h- w, k虽然CHtmlView提供了下面虚函数来得到文档解析完毕的事件。
+ A4 _' n8 Z J! L( M- v
5 r; r4 M2 y( F: L6 p3 w0 Cvirtual void OnDocumentComplete(3 |0 M! r& V, G5 c& X
LPCTSTR lpszURL
8 z/ X) R3 Y S: A; ~6 X& d);' _2 m, w$ }, z$ O
但这个事件在网页存在 frame 的时候不再那么有效了,因为一旦某个frame激发了OnDownloadBegin,那么就会激发OnDocumentComplete,结果你会发现你的一个网页激发了多个OnDocumentComplete,而你也不知道哪个OnDocumentComplete真正能告诉你网页处理完毕了。% _2 O9 `2 D% A) G7 c4 q' B% q
v+ N" r& m$ u' J8 e2 c! u/ {( x
0 E" e& H, z2 X& W( [8 P v. x# w& j. b' I
解决办法有三个:
+ L8 O5 p) Q! P$ P1 Z3 F
5 a' i! V' C, }2 i& N 方法一: 通过CHtmlView::OnProgressChange获取结束事件。 不理会OnDocumentComplete," N. _5 t9 t; U& a$ j8 [% {
1 f! ~# t, Z+ n- Y! ^3 D: z
在OnProgressChange中有两个参数:
5 a& c5 o& X8 E1 fvirtual void OnProgressChange() C8 ~/ F( C* k3 p6 @+ f! b* {6 J2 i4 k
long nProgress,5 K" [/ h }, [6 Y1 A/ w! R/ ?
long nProgressMax 6 Y; k8 e2 a3 C V2 ?* t
);/ \& m# Z k) C- w
当第一个参数nProgress为-1时表示网页处理完毕。
$ a9 c5 F; B9 }/ r/ Y, e7 ?6 K$ n7 O! l8 @( A8 |
另外两种方法可以在微软的知识库获得:
. J. L( o; [* \/ `3 P3 @) h7 _ http://support.microsoft.com/support/kb/articles/q180/3/66.asp
! Q+ y: H: o+ J$ ~* o- J HOWTO: Determine When a Page Is Done Loading in WebBrowser Control" W1 {. { e8 l
Q180366
+ k. Q# L$ B. p6 U - E' W& t! g |6 r- e) r- H
对于其中的方法一有一点补充,在上文support的代码中其在通过调用GetControlUnknown()获得WebBrowser控件的IUnknown指针后调用Release将接口释放了。& v! ]3 \ m. N" t
这是千万不行的!这将导致你的WebBrowser控件无法清除,详细可以参见MSDN对CWnd::GetControlUnknown的介绍。 |
|