【问题标题】:IE9 web control not redrawing itself in CHtmlViewIE9 web 控件不在 CHtmlView 中重绘自身
【发布时间】: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


【解决方案1】:

好的,谜团解开了。似乎单击选项卡还会在代码的其他位置激活拖动循环,在开始拖动之前,执行以下代码以重绘刚刚激活的选项卡:

MSG msg;  
while (::PeekMessage(&msg, NULL, WM_PAINT, WM_PAINT, PM_NOREMOVE))
    {
        if (!::GetMessage(&msg, NULL, WM_PAINT, WM_PAINT))
            return;
        DispatchMessage(&msg);
    }

然而,这段代码似乎完全混淆了 IE9 网络浏览器控件。删除此代码后,重绘效果很好(我必须以其他方式解决拖动行为)。

【讨论】:

    猜你喜欢
    • 2016-09-10
    • 1970-01-01
    • 1970-01-01
    • 2011-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-03
    相关资源
    最近更新 更多