Задержка в рисовании на ОС Windows 7 - PullRequest
0 голосов
/ 05 января 2011

Мне нужно идентифицировать некоторые wnds в моем приложении (объекты класса CMDIChildWnd).Чтобы сделать это, я использую таймер, чтобы альтернативно нарисовать границу wnd с определенным цветом, чтобы дать ощущение мигания.Это прекрасно работает на машинах с WinXP, но с треском проваливается на машинах с Win7;существует значительная задержка в рисовании выделенной границы.
Однако при переключении на оптимизируйте для лучшей производительности установка все работает просто гладко

Я использую CCLinetDC::Rectangle() метод для рисования границы.Есть ли известная проблема с этим API в Win7?Как я могу заставить его работать и на Win7?

1 Ответ

1 голос
/ 05 января 2011

Вы можете попробовать отключить рисование области ЧПУ.

Примерно так:

#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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...