2011-01-05 35 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