代码之家  ›  专栏  ›  技术社区  ›  Toji

取决于合成的ws_ex_的setTimer?

  •  1
  • Toji  · 技术社区  · 14 年前

    奇怪的是:我有一个窗户是用 WS_EX_OVERLAPPEDWINDOW | WS_EX_COMPOSITED . 论 WM_SIZE 我使用 SetTimer ,它在调整大小时暂停100毫秒后调用绘图函数(有助于平滑调整大小)。

    很好,但我注意到如果我把 WS_EX_COMPOSITIED Style,我的计时器突然停止工作!呵呵?我已经确认了 小精灵 正在被调用,但我从未调用回调函数。把风格放回去,一切都会重新快乐起来。

    我有一种感觉,我在这里失去了一些东西。还有人经历过吗?

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

    1 回复  |  直到 14 年前
        1
  •  0
  •   Eugene    14 年前

    我赢了7x64,看起来对我很管用。不管怎样,你可以在这里发布一些小片段,也许它会为你的问题提供一些线索。

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