SetTimer зависит от WS_EX_COMPOSITED?

Странно здесь: у меня есть окно, созданное с расширенным стилем WS_EX_OVERLAPPEDWINDOW | WS_EX_COMPOSITED. На WM_SIZE я создаю (или сбрасываю) таймер с помощью SetTimer, который вызывает функцию рисования после паузы в 100 мс при изменении размера (помогает сгладить изменение размера).

Это работает просто отлично, но я только что заметил, что если я удалю стиль WS_EX_COMPOSITIED, мой таймер внезапно перестанет работать! Хм? Я подтвердил, что SetTimer вызывается, но никогда не нажимал функцию обратного вызова. Вставил стиль обратно, и все снова устраивает.

У меня такое чувство, что я что-то здесь упускаю. Кто-нибудь еще испытал это?

Windows 7, 64-битная (если это имеет значение).


person Toji    schedule 02.03.2010    source источник


Ответы (1)


У меня Win 7 x64, вроде работает. В любом случае, вы можете опубликовать здесь небольшой фрагмент, возможно, он прольет свет на вашу проблему.

class CMainWindow : public CWindowImpl<CMainWindow, CWindow, CFrameWinTraits>
{
public:
    DECLARE_WND_SUPERCLASS(_T("CMainWindow"), CWindow::GetWndClassName())

    BEGIN_MSG_MAP(CMainWindow)
        MSG_WM_SIZE(OnSize)
        MSG_WM_TIMER(OnTimer)
    END_MSG_MAP();

    VOID OnSize(UINT, CSize)
    {
        m_timerId = SetTimer((UINT_PTR)this, 100);
    }

    VOID OnTimer(UINT_PTR)
    {
        KillTimer(m_timerId);
        CDCHandle dc = GetDC();
        Draw(dc);
    }

    VOID Draw(HDC hDC)
    {
        CDCHandle dc(hDC);
        CRect objClientRect;
        GetClientRect(objClientRect);
        dc.FillSolidRect(objClientRect, RGB(0, 255, 0));
    }

private:
    UINT_PTR m_timerId;
};

int main(HINSTANCE hInstance, HINSTANCE, LPSTR, int)
{   
    _Module.Init(0, hInstance, 0);

    CMainWindow wnd;
    wnd.Create(NULL, CWindow::rcDefault, _T("Hello world"));
    wnd.ShowWindow(SW_SHOW);

    CMessageLoop loop;

    _Module.AddMessageLoop(&loop);

    int res = loop.Run();

    _Module.Term();
    return 0;
}
person Eugene    schedule 03.03.2010