|
|
CHtmlView \ WebBrowser2 如何真正知道DocumentComplete. B0 [0 w5 W' }/ Y
+ o' \: @( D# ^# j) ?4 Z! B5 Q
(下文针对CHtmlView,由于WebBrowser2与其类似不再累赘。)( ^( B, |3 G% x7 I7 \
虽然CHtmlView提供了下面虚函数来得到文档解析完毕的事件。% T& d: E9 b9 e+ v5 h$ @' \# \7 {, H
" W) t: k! s# A U* O% A8 u
virtual void OnDocumentComplete(
" l1 n! y4 y Y: A* v( z* f- \& O LPCTSTR lpszURL , n) ?6 a" r( [5 p1 |. s
);
0 m2 m8 Y) H9 D' q但这个事件在网页存在 frame 的时候不再那么有效了,因为一旦某个frame激发了OnDownloadBegin,那么就会激发OnDocumentComplete,结果你会发现你的一个网页激发了多个OnDocumentComplete,而你也不知道哪个OnDocumentComplete真正能告诉你网页处理完毕了。0 W" t6 ^. i7 I6 z
* \. k" w7 ~3 y7 ^* t3 J m
. c$ q5 G( ~ J9 s7 W' H) P4 L
2 i* @' X( A7 ^ ^解决办法有三个:
' y% ?/ A8 @$ b9 u9 A1 Y
7 E5 G. M4 p; c8 O5 h 方法一: 通过CHtmlView::OnProgressChange获取结束事件。 不理会OnDocumentComplete,
. ^" C, _5 w+ N
" K" t# u$ P( C U& E0 n' s$ i' Q在OnProgressChange中有两个参数:4 b2 t. Z [- Z2 L8 }2 i
virtual void OnProgressChange(
$ L) Y' z) i! M: `1 o" b2 u long nProgress,1 R3 D6 f- b7 X# ?
long nProgressMax 0 S3 _, d( f0 Z5 o5 L, x
);0 W; E. J5 G" L' t9 J
当第一个参数nProgress为-1时表示网页处理完毕。
+ V; ]* \7 V7 k7 B$ F5 \$ Y* ]: r. q3 P9 d& m) Z4 J9 U
另外两种方法可以在微软的知识库获得: e1 ~5 s! a( p& z k; T) U
http://support.microsoft.com/support/kb/articles/q180/3/66.asp* E8 w2 T2 i- E9 u
HOWTO: Determine When a Page Is Done Loading in WebBrowser Control+ z6 W. C# v! Y
Q180366- z. x( r: K, N, |
: A. R1 k9 T9 x2 ?3 x) H 对于其中的方法一有一点补充,在上文support的代码中其在通过调用GetControlUnknown()获得WebBrowser控件的IUnknown指针后调用Release将接口释放了。. H* r; g0 u' y+ y( I3 T
这是千万不行的!这将导致你的WebBrowser控件无法清除,详细可以参见MSDN对CWnd::GetControlUnknown的介绍。 |
|