SetTimer依赖于WS_EX_COMPOSITED?

时间:2010-03-02 05:33:56

标签: winapi timer

奇怪的是:我有一个用WS_EX_OVERLAPPEDWINDOW | WS_EX_COMPOSITED扩展样式创建的窗口。在WM_SIZE上我使用SetTimer创建(或重置)一个计时器,在调整大小时暂停100毫秒后调用绘制函数(帮助平滑调整大小。)

这工作正常,但我注意到如果我删除WS_EX_COMPOSITIED样式,我的计时器突然停止工作!咦?我已经确认正在调用SetTimer,但我从未尝试过回调函数。把风格重新放回去,一切都很开心。

我有一种感觉,我在这里遗漏了一些东西。还有其他人经历过这个吗?

Windows 7,64位(如果重要的话。)

1 个答案:

答案 0 :(得分:0)

我有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;
}