【发布时间】:2011-09-08 07:10:58
【问题描述】:
这是一个旧的 MFC 应用程序,它实现了一些选项卡式框架窗口。帧中任何时候都只显示一个CView,在切换标签时,使用以下代码隐藏旧标签内容并显示新标签内容:
oldview->EnableWindow(FALSE);
oldview->ShowWindow(SW_HIDE);
newview->EnableWindow(TRUE);
newview->ShowWindow(SW_SHOW);
newview->SetFocus();
现在这一切都适用于任何类型的 CView-s,包括 CHtmlView 派生的,但在计算机上安装 IE9 时停止工作(IE8 工作正常)。当从 CHtmlView 切换选项卡和切换回 CHtmlView 时,Web 浏览器控件不会重绘自身,并且之前的选项卡内容仍然可见。拖动时,例如在该区域上方出现一个计算器窗口,内容以参差不齐的方式重新出现,表明控件只是不了解窗口内容已失效,需要重新绘制。添加 newview->Invalidate() 调用没有帮助,可能我应该深入研究 CHtmlView 并直接向 Web 浏览器控件发送一些消息?
TIA, 帕沃
【问题讨论】:
-
经过一些试验后,我能够通过预先添加以下代码来强制 webbrowser 控件重新绘制自身:
newview->ShowWindow(SW_MAXIMIZE);newview->ShowWindow(SW_RESTORE);但是,这会导致可见的延迟和一些屏幕闪烁......跨度> -
您是否为您的应用启用了 FEATURE_GPU_RENDERING?
-
不,我不知道 FEATURE_GPU_RENDERING,根据文档,默认情况下应该为 Web 控制托管应用程序禁用它。不过,这似乎是将来要考虑添加的东西!
-
看来 SW_MAXIMISE/SW_RESTORE 技巧在另一台计算机上不起作用。那么,没有人知道如何强制 IE 控件重绘自身吗?我试图调用 IWebBrowser::RedrawWindow(),将 body 元素样式设置为“none”并返回到“block”(在 C++ 代码中)并调用 IHTMLPaintSite::InvalidateRect(),但都无济于事(我不是所以回家了 COM 编程,所以我不太确定我的尝试是最好的)。在 HTML 页面上重绘的唯一内容是动画 gifs...
-
似乎 SW_MAXIMISE/SW_RESTORE 技巧只有效,因为“最小化和最大化时动画窗口”Windows 选项已打开。
标签: c++ mfc internet-explorer-9