Вы можете попробовать отключить рисование области ЧПУ.
Примерно так:
#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;
}