|
CHtmlView \ WebBrowser2 如何真正知道DocumentComplete! y3 c. V* r! e: V
0 q8 W' u/ z* ^9 _& X: } (下文针对CHtmlView,由于WebBrowser2与其类似不再累赘。)0 ?3 z# l% _4 X5 x' P! H
虽然CHtmlView提供了下面虚函数来得到文档解析完毕的事件。' J. i/ P- [( o _ ~) S3 p
7 U2 m$ u" E! u) E! }1 O* O& U
virtual void OnDocumentComplete(
& @: |, l! m% Z+ A+ E LPCTSTR lpszURL
2 F& V% s+ l- H+ [9 P3 t7 ^+ C);
; i; M Z6 t* l; x但这个事件在网页存在 frame 的时候不再那么有效了,因为一旦某个frame激发了OnDownloadBegin,那么就会激发OnDocumentComplete,结果你会发现你的一个网页激发了多个OnDocumentComplete,而你也不知道哪个OnDocumentComplete真正能告诉你网页处理完毕了。" T& v+ |: n5 F) J/ t7 N
' R+ ]7 y5 z& }/ V0 U: _
" W6 n$ Z- p, i# o$ ^' N2 c2 ~# P6 p% g$ n1 e: |1 I( T& a
解决办法有三个:; ` g( |9 F! a9 _& z
$ l$ V4 y- m5 I; ~ 方法一: 通过CHtmlView::OnProgressChange获取结束事件。 不理会OnDocumentComplete,+ `& A0 u1 K3 B# p8 ]
{& D {8 h" g* j. d0 P在OnProgressChange中有两个参数:, Z7 b$ A: g: E
virtual void OnProgressChange(
# _# Z& s% k% ^( X6 A" v$ j: Z, u long nProgress,
' e0 q, F4 Y* m2 M4 c w long nProgressMax
7 x0 y- p) L, S' w5 ?& t' q6 N);7 z0 n, W: Q* V
当第一个参数nProgress为-1时表示网页处理完毕。/ W) x9 z6 o% k' E7 D8 J
6 w5 w [! P" j* x' r) J: g
另外两种方法可以在微软的知识库获得:6 C3 N* s3 U6 |5 e0 S0 \$ ?
http://support.microsoft.com/support/kb/articles/q180/3/66.asp8 \) S3 J3 S1 e, Q
HOWTO: Determine When a Page Is Done Loading in WebBrowser Control& U! Y0 |% c& _0 }. M
Q180366
$ ^0 S" L8 H3 |* X" e
& j7 L" I0 ?$ S! ]) C# n 对于其中的方法一有一点补充,在上文support的代码中其在通过调用GetControlUnknown()获得WebBrowser控件的IUnknown指针后调用Release将接口释放了。+ L3 [ w5 d# j; w- U
这是千万不行的!这将导致你的WebBrowser控件无法清除,详细可以参见MSDN对CWnd::GetControlUnknown的介绍。 |
|