|
|
CHtmlView \ WebBrowser2 如何真正知道DocumentComplete
& m: _$ W3 {- v' _, M8 i% o
]( z. D9 a, s* W; u (下文针对CHtmlView,由于WebBrowser2与其类似不再累赘。)8 O, s% ?; f" |7 a! ?! a
虽然CHtmlView提供了下面虚函数来得到文档解析完毕的事件。
4 j) m' A, w7 O5 Y& P4 W" B/ O8 ?7 X2 i5 K9 G; s3 `) Q
virtual void OnDocumentComplete(
0 Z( {+ [, O9 S8 h- v, K1 u. L LPCTSTR lpszURL
/ K9 n1 W/ J' h8 v);7 \4 O m) a3 N; Q
但这个事件在网页存在 frame 的时候不再那么有效了,因为一旦某个frame激发了OnDownloadBegin,那么就会激发OnDocumentComplete,结果你会发现你的一个网页激发了多个OnDocumentComplete,而你也不知道哪个OnDocumentComplete真正能告诉你网页处理完毕了。
% s0 ~$ v/ ?, Y. a6 `2 }' F/ c5 t$ A/ q1 \+ Y
/ ^* C. g0 Q7 c9 _, V* T+ E" R" y
( z n( Q0 o- {, d; z4 D1 P
解决办法有三个:
0 [ v+ C$ w, L0 p9 R q, s2 W
% A8 f- l# t2 X- G+ J) Y5 P 方法一: 通过CHtmlView::OnProgressChange获取结束事件。 不理会OnDocumentComplete,
# k. \! Y* Z. j/ `. _; d5 p \8 P3 z6 \
在OnProgressChange中有两个参数:
- e: `, f% }9 {. L7 qvirtual void OnProgressChange(
( s! J" L8 B6 X" U. D4 k) i long nProgress,
3 i% E# E; E3 l# Z* S6 u) v long nProgressMax , ^$ Z- q5 G2 g
);
* O- d$ A6 W4 W! F- G 当第一个参数nProgress为-1时表示网页处理完毕。
2 H9 i) P$ E* c& w R9 _
0 t6 Z6 J/ H6 s5 P1 ` E 另外两种方法可以在微软的知识库获得:
/ t% j; J. T1 o* K% W; d http://support.microsoft.com/support/kb/articles/q180/3/66.asp( ^$ [; m7 X0 Z- m/ f# I
HOWTO: Determine When a Page Is Done Loading in WebBrowser Control/ J1 [; R6 \% `: D6 q0 \
Q180366! ?+ ~ g; Y, H" z" h+ t
* z( y1 B( T) k6 A8 I( L7 j Y
对于其中的方法一有一点补充,在上文support的代码中其在通过调用GetControlUnknown()获得WebBrowser控件的IUnknown指针后调用Release将接口释放了。
; d3 ^: Q8 K! ^6 w- _8 r 这是千万不行的!这将导致你的WebBrowser控件无法清除,详细可以参见MSDN对CWnd::GetControlUnknown的介绍。 |
|