|
CHtmlView \ WebBrowser2 如何真正知道DocumentComplete6 J0 a$ A: T" E; B4 x3 X, ?8 A
# H2 R: n9 F- J- k (下文针对CHtmlView,由于WebBrowser2与其类似不再累赘。)
" V" Z! y+ E2 z$ L/ f! N3 w9 V虽然CHtmlView提供了下面虚函数来得到文档解析完毕的事件。
5 }" k+ u5 U; M
* t# B% b6 z% yvirtual void OnDocumentComplete(( X7 |7 s9 g* `5 I( T, c! Y# u$ C
LPCTSTR lpszURL
" i$ u6 A4 w- y' p);% G$ |% d4 \. x( j/ M% u- k4 c
但这个事件在网页存在 frame 的时候不再那么有效了,因为一旦某个frame激发了OnDownloadBegin,那么就会激发OnDocumentComplete,结果你会发现你的一个网页激发了多个OnDocumentComplete,而你也不知道哪个OnDocumentComplete真正能告诉你网页处理完毕了。% j, o/ y7 I. Q) ^5 u9 c0 e
1 e2 J- ^2 y. h; h% k0 i+ O- ]8 {
" S3 Y8 |$ j T0 U: [4 y' I5 M
3 i3 n$ ]: R% A解决办法有三个:
1 {) V, d1 R/ M; o/ l0 O; U9 K& \0 s: O u4 _
方法一: 通过CHtmlView::OnProgressChange获取结束事件。 不理会OnDocumentComplete,
9 |$ S) H* U% Z& z- V" A
9 H. U7 l* x0 [在OnProgressChange中有两个参数:+ C, {8 b( W8 X0 n% J; C [
virtual void OnProgressChange(
9 ~6 S' a) Y4 I" ^1 D long nProgress,$ c$ D: l' A- a( W* A
long nProgressMax 7 f4 ?8 O# O* F/ m
);1 ?' g6 Z# S" Y% b! i
当第一个参数nProgress为-1时表示网页处理完毕。
! }* M) l) @/ o9 Z6 _& ?
% X, ]' S( S4 O& ] 另外两种方法可以在微软的知识库获得:5 k+ R# l) ]4 ~7 n
http://support.microsoft.com/support/kb/articles/q180/3/66.asp) d6 L* g/ e/ V: G) d, A2 Z1 M. l D
HOWTO: Determine When a Page Is Done Loading in WebBrowser Control& K2 M a3 b3 ?- G- \) `
Q180366# m5 S; ~9 Y) |4 ~6 C' A6 z
" ]1 `1 r, k# O- T 对于其中的方法一有一点补充,在上文support的代码中其在通过调用GetControlUnknown()获得WebBrowser控件的IUnknown指针后调用Release将接口释放了。1 L) C; |# r+ \8 ~* p
这是千万不行的!这将导致你的WebBrowser控件无法清除,详细可以参见MSDN对CWnd::GetControlUnknown的介绍。 |
|