C++ IE9 web控件未在CHtmlView中重新绘制自身

C++ IE9 web控件未在CHtmlView中重新绘制自身,c++,mfc,internet-explorer-9,C++,Mfc,Internet Explorer 9,这是一个旧的MFC应用程序,它实现了一些选项卡式框架窗口。框架中任何时候都只显示一个CView,切换选项卡时,以下代码用于隐藏旧选项卡内容并显示新选项卡: oldview->EnableWindow(FALSE); oldview->ShowWindow(SW_HIDE); newview->EnableWindow(TRUE); newview->ShowWindow(SW_SHOW); newview->SetFocus(); 现在,这一切对于任何类型的CVi

这是一个旧的MFC应用程序,它实现了一些选项卡式框架窗口。框架中任何时候都只显示一个CView,切换选项卡时,以下代码用于隐藏旧选项卡内容并显示新选项卡:

oldview->EnableWindow(FALSE);
oldview->ShowWindow(SW_HIDE);
newview->EnableWindow(TRUE);
newview->ShowWindow(SW_SHOW);
newview->SetFocus();
现在,这一切对于任何类型的CView-s都很有效,包括CHtmlView派生的CView-s,但在计算机上安装IE9时就停止了工作(IE8工作正常)。在将选项卡从CHtmlView切换到CHtmlView或切换回CHtmlView时,web浏览器控件不会重新绘制自身,并且上一个选项卡内容仍然可见。例如,将计算器窗口拖动到该区域上时,内容以参差不齐的方式重新出现,表明控件不理解窗口内容已无效,需要重新绘制。添加一个newview->Invalidate()调用没有帮助,也许我应该在CHtmlView中深入挖掘,并直接向web浏览器控件发送一些消息

蒂亚,
帕沃

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

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

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

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

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

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

经过一些实验,我能够通过预先添加以下代码强制webbrowser控件重新绘制自身:
newview->ShowWindow(SW\u)
newview->ShowWindow(软件恢复)但是,这会导致可见延迟和一些屏幕闪烁…您是否为应用程序启用了FEATURE_GPU_渲染?不,我不知道FEATURE_GPU_渲染,根据文档,默认情况下,web控件托管应用程序应禁用FEATURE_GPU_渲染。然而,这似乎是未来要考虑的事情!似乎SW_最大化/SW_还原技巧在另一台计算机上不起作用。那么,难道没有人知道如何强制IE控件重新绘制自己吗?我曾尝试调用iWebBuffel::ReDrWrdWOWE(),将体元素样式设置为“No.',然后返回到‘Boad’(在C++代码中),并调用IHTMLPrimtSt::ValueAtdioTeCube(),都没有用(我不太熟悉COM编程,所以我不太确定我的尝试是最好的)。HTML页面上唯一被重画的是动画GIF…似乎SW_Maximize/SW_RESTORE技巧只起作用,因为“最小化和最大化时动画化窗口”Windows选项已打开。经过一些实验后,我能够通过预加以下代码强制webbrowser控件重新绘制自身:
newview->ShowWindow(SW_)
newview->ShowWindow(软件恢复)但是,这会导致可见延迟和一些屏幕闪烁…您是否为应用程序启用了FEATURE_GPU_渲染?不,我不知道FEATURE_GPU_渲染,根据文档,默认情况下,web控件托管应用程序应禁用FEATURE_GPU_渲染。然而,这似乎是未来要考虑的事情!似乎SW_最大化/SW_还原技巧在另一台计算机上不起作用。那么,难道没有人知道如何强制IE控件重新绘制自己吗?我曾尝试调用iWebBuffel::ReDrWrdWOWE(),将体元素样式设置为“No.',然后返回到‘Boad’(在C++代码中),并调用IHTMLPrimtSt::ValueAtdioTeCube(),都没有用(我不太熟悉COM编程,所以我不太确定我的尝试是最好的)。HTML页面上唯一被重画的是动画GIF…似乎SW_Maximize/SW_RESTORE技巧只起作用,因为“最小化和最大化窗口时设置窗口动画”选项已打开。