2010-03-02 70 views
1

奇怪的一個在這裏:我有一個窗口創建了一個擴展樣式WS_EX_OVERLAPPEDWINDOW | WS_EX_COMPOSITED。在WM_SIZE創建(或重置)使用SetTimer一個定時器,它在調整大小以100毫秒的暫停後調用繪製函數(有助於平滑調整大小。)SetTimer依賴於WS_EX_COMPOSITED?

這工作得很好,但我注意到,如果我刪除WS_EX_COMPOSITIED風格,突然我的計時器停止工作!咦?我已經確認SetTimer正在被調用,但我從來沒有打過回調函數。把風格放回去,一切都很開心。

我有一種感覺,我在這裏失去了一些東西。有沒有其他人經歷過這個?

Windows 7中,64位(如果它很重要。)

回答

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