|
|
CHtmlView \ WebBrowser2 如何真正知道DocumentComplete
( ~+ n% k/ I- X* b
9 @! y7 D# a( z( \ (下文针对CHtmlView,由于WebBrowser2与其类似不再累赘。)) F1 H; Q0 ]; b5 l/ B" L7 ^+ G
虽然CHtmlView提供了下面虚函数来得到文档解析完毕的事件。$ J I4 [* A7 d; i& U2 w+ i
7 P% B6 o/ h Z* X8 N1 o
virtual void OnDocumentComplete(
* |0 M5 L9 i3 U" H LPCTSTR lpszURL ' S) b/ d3 U# z" S
);: |( v' v8 }0 i6 u! B6 a
但这个事件在网页存在 frame 的时候不再那么有效了,因为一旦某个frame激发了OnDownloadBegin,那么就会激发OnDocumentComplete,结果你会发现你的一个网页激发了多个OnDocumentComplete,而你也不知道哪个OnDocumentComplete真正能告诉你网页处理完毕了。
9 R2 F0 A5 C8 g6 c0 ~7 x9 c$ [0 ^7 A( x% @
6 U1 _" ^! [7 n5 L4 N3 c2 c3 L
4 v6 h- o* y+ t* h
解决办法有三个:! {2 E* c+ C& ~- v( ?
4 s" Q/ G/ e# M8 l: ^7 h$ _ 方法一: 通过CHtmlView::OnProgressChange获取结束事件。 不理会OnDocumentComplete,
|; ]. I! G& c" x2 v8 K/ {1 |% r6 i3 L: C( P
在OnProgressChange中有两个参数:
0 C: c6 R% A. d( Cvirtual void OnProgressChange(
, l& Z* m P- N. L# i8 n: h6 I$ y8 \' d long nProgress,$ P' `3 v: R0 i, \: R& U
long nProgressMax 9 x( |$ y* q, {! w8 d f
);( P: K6 ~; U; Z; V$ v
当第一个参数nProgress为-1时表示网页处理完毕。0 V7 @, @7 _9 I, ~2 \
. s) Y* }# E3 {. `
另外两种方法可以在微软的知识库获得:) \5 h7 ?$ x/ }; y+ Y
http://support.microsoft.com/support/kb/articles/q180/3/66.asp) ^0 K7 ]' V& e q' Y
HOWTO: Determine When a Page Is Done Loading in WebBrowser Control. \+ k, ?2 X' |" y( t l2 b
Q180366: l' c p/ }9 Y$ s
2 f0 t4 X' q$ X6 j, A
对于其中的方法一有一点补充,在上文support的代码中其在通过调用GetControlUnknown()获得WebBrowser控件的IUnknown指针后调用Release将接口释放了。2 U0 Q( }6 C- w7 a( |
这是千万不行的!这将导致你的WebBrowser控件无法清除,详细可以参见MSDN对CWnd::GetControlUnknown的介绍。 |
|