在有些情况下,窗口内嵌的浏览器控件不能及时重绘。例如,我们建立一个"消息提示窗",采用浏览器控件显示消息的内容。当我们采用AnimateWindow进行动画显示时,浏览器控件会显示一片空白。下面我们探讨浏览器控件的重绘问题。
- 重现场景。
// 生成一个窗口(略)
HWND hwnd = 窗口handle.
// 内嵌浏览器控件。
::AtlAxCreateControlEx(L“about:blank”,hwnd,NULL,NULL,(IUnknown ** ) & pUnkControl);
...
// 窗口动画。
// 为了程序的兼容性,当AnimateWindow失败时,要调用传统的ShowWindow。
if ( ! ::AnimateWindow(hwnd, 200 ,AW_SLIDE | AW_VER_NEGATIVE))
... {
::ShowWindow(hwnd,SW_SHOW);
} - 重绘的目标。
一个浏览器控件的窗口层次如下:
--Shell Embedding
----Shell DocObject View
------Internet Explorer_Server
我们需要重绘的目标是类名为“Internet Explorer_Server”的窗口句柄。为了支持最新的vista系统,不能简单地通过IWebBrowser2->get_HWND取得窗口句柄。下面,我们通过AtlAxCreateControlEx返回的