Visual c++ windows 7操作系统上的绘图延迟

Visual c++ windows 7操作系统上的绘图延迟,visual-c++,mfc,windows-7,Visual C++,Mfc,Windows 7,我需要识别应用程序中的一些WND(CMDIChildWnd类的对象)。 为了做到这一点,我使用一个定时器绘制的边界的wnd与特定的颜色交替,以便给人的感觉闪烁。这在WinXP机器上运行得很好,但在Win7机器上运行得很糟糕;在绘制突出显示的边框时有明显延迟。 然而,当切换到“优化以获得最佳性能”设置时,一切工作都很顺利 我正在使用CCLinetDC::Rectangle()方法绘制边框。Win7中该API是否存在已知问题?如何使其在Win7上也工作?您可以尝试禁用NC区域绘制 如下所示: #in

我需要识别应用程序中的一些WND(CMDIChildWnd类的对象)。 为了做到这一点,我使用一个定时器绘制的边界的wnd与特定的颜色交替,以便给人的感觉闪烁。这在WinXP机器上运行得很好,但在Win7机器上运行得很糟糕;在绘制突出显示的边框时有明显延迟。
然而,当切换到“优化以获得最佳性能”设置时,一切工作都很顺利


我正在使用
CCLinetDC::Rectangle()
方法绘制边框。Win7中该API是否存在已知问题?如何使其在Win7上也工作?

您可以尝试禁用NC区域绘制

如下所示:

#include <dwmapi.h>
...

HRESULT hr = E_FAIL;
if (IsVistaOrAbove())
{
    DWMNCRENDERINGPOLICY ncrp = DWMNCRP_DISABLED;
    hr = ::DwmSetWindowAttribute(m_hWnd, DWMWA_NCRENDERING_POLICY, &ncrp, sizeof(ncrp));
    ASSERT(SUCCEEDED(hr));
}

一个问题-这是全局设置NC渲染策略(即,也适用于所有其他应用程序)还是仅针对特定于句柄的窗口设置NC渲染策略?事件(识别窗口)结束后,我们是否应重置原始设置?此外,我仅在客户端区域绘制矩形,而不是在NC区域。我使用的是
CCLinetDC
,它肯定只在客户端区域绘制。@Hemant啊。。我的话有误导性。无论如何,这可能是与DWM相关的问题。您可以通过查看禁用DWM合成时问题是否已解决来验证它。将桌面主题更改为非Aero主题。@Hemant抱歉,我错过了您提到的CClientDC。DwmSetWindowAttribute更改窗口特定属性(顶级窗口)。使用DWMICompositionEnabled API检查是否启用了DWM组合。@9dan:还有一件事,这段代码是否在XP机器上编译/运行?切换到“优化以获得最佳性能”的是什么?是编译器选项还是操作系统设置?还是操作系统设置。在“控制面板”的“调整视觉效果”设置下精确调整。
typedef HRESULT (WINAPI *pfnDwmIsCompositionEnabled)(BOOL *pfEnabled);
static pfnDwmIsCompositionEnabled s_DwmIsCompositionEnabled;
typedef HRESULT (WINAPI *pfnDwmSetWindowAttribute)(HWND hwnd, DWORD dwAttribute, LPCVOID pvAttribute, DWORD cbAttribute);
static pfnDwmSetWindowAttribute s_DwmSetWindowAttribute;
typedef HRESULT (WINAPI *pfnDwmGetWindowAttribute)(HWND hwnd, DWORD dwAttribute, LPCVOID pvAttribute, DWORD cbAttribute);
static pfnDwmGetWindowAttribute s_DwmGetWindowAttribute;


HMODULE hSysDll = LoadLibrary(_T("dwmapi.dll"));
if(hSysDll) // Loaded dwmapi.dll success, must Vista or above
{
    s_DwmIsCompositionEnabled = (pfnDwmIsCompositionEnabled)GetProcAddress(hSysDll, "DwmIsCompositionEnabled");
    s_DwmSetWindowAttribute = (pfnDwmSetWindowAttribute)GetProcAddress(hSysDll, "DwmSetWindowAttribute");
    s_DwmGetWindowAttribute =  (pfnDwmGetWindowAttribute)GetProcAddress(hSysDll, "DwmGetWindowAttribute");
}
...  
...  
bool IsAeroEnabled()
{
    BOOL bAero = FALSE;
    if(s_DwmIsCompositionEnabled)
        s_DwmIsCompositionEnabled(&bAero);
    return bAero != FALSE;
}
...  
...  
HRESULT ProxyDwmSetWindowAttribute(HWND hwnd, DWORD dwAttribute, LPCVOID pvAttribute, DWORD cbAttribute)
{
    if (s_DwmSetWindowAttribute)
    {
        return s_DwmSetWindowAttribute(hwnd, dwAttribute, pvAttribute, cbAttribute);
    }
    return E_FAIL;
}