我需要識別我的應用程序中的一些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