2012-05-02 27 views
1

我想在長任務之前更改光標。我用setcursor改變了它,但光標沒有改變。如何在長期任務之前更改光標?

這裏是我的代碼:

HCURSOR hWait = AfxGetApp()->LoadStandardCursor(IDC_WAIT) ; 
    HCURSOR hDefault = AfxGetApp()->LoadStandardCursor(IDC_ARROW); 
    ::SetCursor(hWait); 

    //a long procedure 

    ::SetCursor(hDefault); 

我在做什麼錯?

+1

http://support.microsoft.com/kb/131991 –

+0

對不起,這是我的愚蠢的錯誤。我將我的代碼添加到錯誤的消息處理程序謝謝! – bucherren

回答

2

這樣做的一個非常方便的方法是在長任務的開始(或剛剛開始之前)創建一個CWaitCursor的實例。它設置光標,當它超出範圍時將它恢復它(在析構函數):

{ 
    CWaitCursor wait; 

    // Long task 

} // The cursor is restored here 
+0

IMO,'CWaitCursor'大多沒用。如果你有一個長時間運行的任務阻止了你的窗口處理消息,那麼你的窗口將變得沒有響應(並且可能會停止繪畫)。如果你正在處理消息,那麼遊標可能被重置,而你應該處理'WM_SETCURSOR'消息。 – jamesdlin

+0

@jamesdlin我從來沒有遇到任何問題。而且,通過查看它的代碼,我會說它和':: SetCursor()'一樣。實際上,'CWaitCursor'的構造函數調用'CCmdTarget :: BeginWaitCursor()',它調用調用':: SetCursor()'的'CWinApp :: DoWaitCursor()'。 – MikMik

+0

'WM_SETCURSOR'與'SetCursor'不同。如果您在等待期間處理窗口消息,則窗口必須處理(不發送)WM_SETCURSOR並調用SetCursor。 http://blogs.msdn.com/b/oldnewthing/archive/2006/11/21/1115695.aspx – jamesdlin