我需要识别我的应用程序中的一些wnds(CMDIChildWnd类的对象)。 要做到这一点,我正在使用一个计时器来绘制wnd与特定颜色交替的边框,以便给人闪烁的感觉。这在WinXP机器上工作得很好,但在Win7机器上表现得很差;绘制突出显示的边框会有明显的延迟。
但是,当切换到优化以获得最佳性能设置一切正常顺利。延迟在Windows 7绘图OS
我使用CCLinetDC::Rectangle()
方法绘制边框。 Win7中有这个API的一些已知问题吗?我怎样才能让它在Win7上工作呢?
我需要识别我的应用程序中的一些wnds(CMDIChildWnd类的对象)。 要做到这一点,我正在使用一个计时器来绘制wnd与特定颜色交替的边框,以便给人闪烁的感觉。这在WinXP机器上工作得很好,但在Win7机器上表现得很差;绘制突出显示的边框会有明显的延迟。
但是,当切换到优化以获得最佳性能设置一切正常顺利。延迟在Windows 7绘图OS
我使用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));
}
但它也禁用窗口上的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;
}
一个问题 - 这是否会在全局范围内(即针对所有其他应用程序)设置NC渲染策略,还是仅针对该句柄特定的窗口?在事件(识别窗口)结束后我们是否应该重置原始设置? – Hemant 2011-01-05 12:27:54
此外,我只绘制客户区中的矩形,而不是在NC区域。我正在使用'CCLinetDC',这当然只能在客户区使用。 – Hemant 2011-01-05 12:32:17
@Hemant啊..我的话是误导性的。无论如何,这可能是DWM相关的问题。您可以通过查看DWM组合被禁用时是否解决问题来验证它。将桌面主题更改为非Aero。 – 9dan 2011-01-05 13:33:11
什么东西被切换到 “优化最佳性能?”这是一个编译器选项或操作系统设置或? – 2011-01-05 12:57:11
其操作系统设置David。正是在控制面板的_Adjust Visual Effects_设置下。 – Hemant 2011-01-06 04:27:11