SetTimer зависит от WS_EX_COMPOSITED? - PullRequest
1 голос
/ 02 марта 2010

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

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

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

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

1 Ответ

0 голосов
/ 03 марта 2010

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