2011-01-05 59 views
0

我需要识别我的应用程序中的一些wnds(CMDIChildWnd类的对象)。 要做到这一点,我正在使用一个计时器来绘制wnd与特定颜色交替的边框,以便给人闪烁的感觉。这在WinXP机器上工作得很好,但在Win7机器上表现得很差;绘制突出显示的边框会有明显的延迟。
但是,当切换到优化以获得最佳性能设置一切正常顺利。延迟在Windows 7绘图OS

我使用CCLinetDC::Rectangle()方法绘制边框。 Win7中有这个API的一些已知问题吗?我怎样才能让它在Win7上工作呢?

+0

什么东西被切换到 “优化最佳性能?”这是一个编译器选项或操作系统设置或? – 2011-01-05 12:57:11

+0

其操作系统设置David。正是在控制面板的_Adjust Visual Effects_设置下。 – Hemant 2011-01-06 04:27:11

回答

1

您可以尝试禁用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)); 
} 

但它也禁用窗口上的Aero。

因此,在客户区不在边界内显示眨眼会更直接。

修订

对于XP的兼容性,你应该使用DWM的API是这样的:

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; 
} 
+0

一个问题 - 这是否会在全局范围内(即针对所有其他应用程序)设置NC渲染策略,还是仅针对该句柄特定的窗口?在事件(识别窗口)结束后我们是否应该重置原始设置? – Hemant 2011-01-05 12:27:54

+0

此外,我只绘制客户区中的矩形,而不是在NC区域。我正在使用'CCLinetDC',这当然只能在客户区使用。 – Hemant 2011-01-05 12:32:17

+0

@Hemant啊..我的话是误导性的。无论如何,这可能是DWM相关的问题。您可以通过查看DWM组合被禁用时是否解决问题来验证它。将桌面主题更改为非Aero。 – 9dan 2011-01-05 13:33:11