2012-05-02 1 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'のコンストラクタは' :: SetCursor() 'を呼び出す' CWinApp :: DoWaitCursor() 'を呼び出す' CCmdTarget :: BeginWaitCursor() 'を呼び出します。 – MikMik

+0

'WM_SETCURSOR'は' SetCursor'と同じではありません。待っている間にウィンドウメッセージを処理している場合、ウィンドウは 'WM_SETCURSOR'を処理して(送信しないで)' SetCursor'を呼び出さなければなりません。 http://blogs.msdn.com/b/oldnewthing/archive/2006/11/21/1115695.aspx – jamesdlin

関連する問題