|
|
CHtmlView \ WebBrowser2 如何真正知道DocumentComplete
' [9 q6 ^4 S3 T: d8 V/ U0 Q
- h9 l5 Z2 {1 p6 R8 P+ b3 h (下文针对CHtmlView,由于WebBrowser2与其类似不再累赘。)
/ A" s2 W* ?8 D7 l# a# o' F虽然CHtmlView提供了下面虚函数来得到文档解析完毕的事件。' n& M" X7 G! ]; ]( }; _; x
3 V8 }! m8 Y. P' d" M. H$ F/ p
virtual void OnDocumentComplete(- i7 i ^# [9 n" @( n' N; O0 O
LPCTSTR lpszURL
% W5 \- M( M4 f% ~5 X! _; x);
) T3 I- } m5 W但这个事件在网页存在 frame 的时候不再那么有效了,因为一旦某个frame激发了OnDownloadBegin,那么就会激发OnDocumentComplete,结果你会发现你的一个网页激发了多个OnDocumentComplete,而你也不知道哪个OnDocumentComplete真正能告诉你网页处理完毕了。8 E, o+ z# d5 ^2 y! F, C6 v
# s& V/ p, S9 l" ~! J
( \; k/ z$ C: E
/ p( ]( N, M. [% ]
解决办法有三个:
- N8 E/ \( q1 A, y0 s2 x/ O9 f0 }# I1 S- c! Y" O: `
方法一: 通过CHtmlView::OnProgressChange获取结束事件。 不理会OnDocumentComplete,8 C5 l+ |$ C- i! [) w+ n) i4 T
7 K# P. J' L: U% N, }在OnProgressChange中有两个参数:+ b1 s' o6 _4 ^
virtual void OnProgressChange(
8 [# q8 d0 N7 D, \+ i% o long nProgress,
/ ^- z4 [+ Z+ y long nProgressMax " w6 n2 ]" P7 S# }; |3 F# I9 i: Z
);; ~ b @- r/ s6 Y0 |
当第一个参数nProgress为-1时表示网页处理完毕。5 v+ u) E ~9 l, S( s/ F
% H8 @7 @+ k. W' [5 F' T
另外两种方法可以在微软的知识库获得:
: S* @/ _" _7 ~6 N3 z: ^) r http://support.microsoft.com/support/kb/articles/q180/3/66.asp. O! Y& K P* X3 w" H- v
HOWTO: Determine When a Page Is Done Loading in WebBrowser Control; u; C2 x$ r, {" y, {
Q180366
5 X. i% u [; B2 q; _
: p0 \4 `7 R! n' k; x 对于其中的方法一有一点补充,在上文support的代码中其在通过调用GetControlUnknown()获得WebBrowser控件的IUnknown指针后调用Release将接口释放了。
A* \$ G) z0 e2 {+ X 这是千万不行的!这将导致你的WebBrowser控件无法清除,详细可以参见MSDN对CWnd::GetControlUnknown的介绍。 |
|