【问题标题】:SetTimer dependent on WS_EX_COMPOSITED?SetTimer 依赖于 WS_EX_COMPOSITED?
【发布时间】:2010-03-02 05:33:55
【问题描述】:

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

这工作得很好,但我注意到如果我删除WS_EX_COMPOSITIED 样式,我的计时器突然停止工作!嗯?我已经确认正在调用SetTimer,但我从未点击过回调函数。把样式放回去,一切都又快乐起来了。

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

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

【问题讨论】:

    标签: winapi timer


    【解决方案1】:

    我有 Win 7 x64,看起来它适合我。无论如何,您可以在这里发布一些小sn-p,也许它会为您分享一些问题。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-19
      • 1970-01-01
      • 2012-05-23
      • 1970-01-01
      • 2021-08-07
      • 2020-04-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多